@Component装饰器到底做了什么?
问题描述:
从official docs我们知道@Component装饰器到底做了什么?
组件装饰让你标记一个类为角分量并提供确定组件应该如何处理,实例化,并在运行时使用额外的元数据。
但我想更深入和了解组件装饰确实除了提供额外的元数据。
我跳入源代码,发现所有装饰器都是在makeDecorator函数的帮助下创建的。在这里我迷路了。例如,Component和ngModule装饰器的区别在哪里?他们做同样的事情吗?不要这样想。
就像一个答案,它将是非常好的一步一步描述我应该做什么来重新创建没有makeDecorator函数的组件装饰。
UPD:是的,当然,我知道TypeScript装饰器是如何工作的。
答
但我想深入了解Component Decorator的真正用途,除了提供额外的元数据。
为什么它需要更多?据说传递给装饰器功能@Component
的参数是元件元数据。所以这是提供元数据的主要责任。
最简单的方法,如果你想重现类似的东西是
-
npm install --save reflect-metadata
-
创建装饰功能
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决定如何处理元数据,而不是装饰器功能。
供参考:以我'@角/ cli' @ 1.2。1项目中,我不得不在'main.ts'文件的顶部导入'reflect-metadata',以使编译器意识到'defineMetadata'和'getMetadata'函数。在装饰器源文件中执行导入导致编译器抱怨缺少'@ NgModule'装饰器。 – TekTimmy