Метод Reflect-Metadata Reflect.getMetadata() не возвращает метаданные в цепочке прототипов предоставленного объекта

Я использую отражающие метаданные 0.1.2. У меня есть родительский класс как «MyCustom».

export class MyCustom {}

Мой класс компонентов "Home" расширяет этот класс "MyCustom".

@Component({
  selector: 'home',
  templateUrl: './app/components/home/home.html',
  styleUrls: ['./app/components/home/home.css']
})
export class Home extends MyCustom {
}

Мое намерение состоит в том, чтобы получить метаданные всех классов, которые расширяют класс «MyCustom», используя следующий вызов метода.

let annotations = Reflect.getMetadata('annotations', MyCustom);

Комментарии к методу Reflect.getMetadata() говорят:

Получает значение метаданных для предоставленного ключа метаданных целевого объекта или его цепочки прототипов.

Однако я ничего не получаю. Если я добавлю @Component в класс MyCustom, как показано ниже,

@Component({
  selector: 'hello'
})
export class MyCustom {}

Я получаю один результат, который является аннотацией «MyCustom».

Почему я не получаю аннотации к подклассам? Любая помощь высоко ценится.


person Rajind Ruparathna    schedule 10.10.2016    source источник


Ответы (1)


Метаданные сохраняются для Home, а не для MyCustom, и наследование здесь не действует.

Что вы, вероятно, можете сделать, так это иметь свой собственный декоратор, который добавит метаданные для родительского класса, а затем вызовет декоратор Component с необходимыми значениями.
Что-то вроде:

function MyComponent(props: any) {
    return (ctor) => {
        Reflect.defineMetadata('annotations', ctor.prototype.name, ctor.prototype);
        return Component(props)(ctor);
    }
}

@MyComponent({
    selector: 'home',
    templateUrl: './app/components/home/home.html',
    styleUrls: ['./app/components/home/home.css']
})
class Home extends MyCustom {}

Я не проверял это и не делал ничего подобного раньше, но, вероятно, это должно сработать.


Почему бы вам не использовать "реестр"?
Сделайте что-то вроде этого:

const REGISTRY: { [name: string]: MyCustom } = {};

Затем для каждого такого компонента зарегистрируйте его:

class Home extends MyCustom {
    ...
}

REGISTRY["home"] = Home;

Реестр и компоненты не обязательно должны находиться в одном файле, если вы импортируете его туда, где это необходимо.

Затем из вашего основного компонента легко получить все эти компоненты.

person Nitzan Tomer    schedule 10.10.2016
comment
Спасибо за ваш ответ. Я пытался заставить его работать, используя это, но пока не повезло. Позвольте мне дать полный обзор того, что я пытаюсь сделать. Мое основное приложение при запуске не знает о подкомпонентах (в основном, о вкладках). Я пытаюсь аннотировать подкомпоненты с помощью пользовательской аннотации, сканировать их из основного компонента и добавлять. - person Rajind Ruparathna; 11.10.2016
comment
Единственным способом сканирования аннотаций был Reflect.getMetadata(), для которого требуется целевой объект. Вот почему я пытался использовать суперкласс в качестве MyCustom и позволить моим подкомпонентам расширять его. (В тот момент я надеялся, что Reflect.getMetadata('annotations', MyCustom); также вернет аннотации подклассов) - person Rajind Ruparathna; 11.10.2016