Что именно делает @Component decorator?
Из официальных документов мы знаем, что
Декоратор компонента позволяет пометить класс как угловой компонент и предоставить дополнительные метаданные, которые определяют, как компонент должен обрабатываться, создаваться и использоваться во время выполнения.
Но я бы хотел глубже понять, что на самом деле делает Компонентный декоратор, кроме предоставления дополнительных метаданных.
Я погрузился в исходный код и обнаружил, что все декораторы создаются с помощью функции makeDecorator. И тут я заблудился. В чем разница, например, для декораторов Component и ngModule? Они делают то же самое? Не думай так.
Как ответ, было бы здорово иметь пошаговое описание того, что я должен сделать, чтобы воссоздать Component Decorator без функции makeDecorator.
UPD: и, да, конечно, я знаю, как работают декораторы TypeScript.
1 ответ
Но я бы хотел глубже понять, что на самом деле делает Компонентный декоратор, кроме предоставления дополнительных метаданных.
Почему это должно быть что-то еще? Говорят, что аргумент передан @Component
Функция декоратора является компонентом метаданных. Так что это основная ответственность за предоставление метаданных.
Самый простой способ, если вы хотите воспроизвести нечто подобное, это
Установите
reflect-metadata
,npm install --save reflect-metadata
Создать функцию декоратора 1
import 'reflect-metadata'; interface MyComponentMetadata { template?: string; selector?: string; } function MyComponent(metadata: MyComponentMetadata) { return function(ctor: Function) { // add metadata to constructor Reflect.defineMetadata('annotations', metadata, ctor); } }
Используй это
@MyComponent({ selector: 'component', template: '<hello></hello>' }) class HelloComponent { }
Теперь, когда вам нужно получить метаданные, просто сделайте
let metadata = Reflect.getMetadata('annotations', HelloComponent);
Цель метаданных - предоставить Angular информацию о том, что делать с классом. Таким образом, декоратор не должен быть чем-то большим, чем просто поставщик метаданных. Angular решает, что делать с метаданными, а не с функцией декоратора.