You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
import { NgModule, Component } from '@angular/core';
@Component({
selector: 'example-component',
template: '<div>Woo a component!</div>'
})
export class ExampleComponent {
constructor() {
console.log('Hey I am a component!');
}
}
Angular 2 属性装饰器示例:
import { Component, Input } from '@angular/core';
@Component({
selector: 'example-component',
template: '<div>Woo a component!</div>'
})
export class ExampleComponent {
@Input()
exampleProperty: string;
}
Angular 2 方法装饰器示例:
import { Component, HostListener } from '@angular/core';
@Component({
selector: 'example-component',
template: '<div>Woo a component!</div>'
})
export class ExampleComponent {
@HostListener('click', ['$event'])
onHostClick(event: Event) {
// clicked, `event` available
}
}
Angular 2 参数装饰器示例:
import { Component, Inject } from '@angular/core';
import { MyService } from './my-service';
@Component({
selector: 'example-component',
template: '<div>Woo a component!</div>'
})
export class ExampleComponent {
constructor(@Inject(MyService) myService) { // 与myService: MyService等价
console.log(myService);
}
}
在 Angular 2 Decorators - part 1 文章中,我们介绍了 TypeScript 中的四种装饰器。本文的主要目的是介绍 Angular 2 中常见的内置装饰器。Angular 2 内置装饰器分类:
Angular 2 类装饰器示例:
Angular 2 属性装饰器示例:
Angular 2 方法装饰器示例:
Angular 2 参数装饰器示例:
下面我们就着重分析一下最常用的类装饰器 @component ,其它的装饰器读者有兴趣的话,可以参考 Component 的分析思路自行分析。
首先从最简单的例子入手,我们都知道采用 TypeScript 开发,为了保证兼容性最终都会转换成标准的 ES 5代码。上面的例子转成如下的代码:
通过 Angular 2 Decorators - part 1 文章,我们知道 TypeScript 类装饰器的声明:
而转换后 ES5 代码中 __decorate 函数的方法签名是 function (decorators, target, key, desc) 。因此我们可以推断,core_1.Component 是一个函数,该函数调用后返回一个 ClassDecorator 。类似于 Angular 2 Decorators - part 1 文章中的 Greeter 装饰器:
那我们来看一下 @angular/core 模块中导出的 Component 函数:
让我们继续来看一下 makeDecorator 这个函数:
通过阅读以上的源码,我们发现当调用 makeDecorator('Component', {..}, Directive) 方法时,返回的是
DecoratorFactory 函数,该函数只接收一个参数,当调用该工厂函数时,则返回 TypeDecorator 函数即类装饰器。回到最早的例子,当我们调用 core_1.Component({ selector: 'my-app', template: "..." }) 创建的 annotationInstance 实例,内部结构如下:
现在我们来梳理一下整个流程,系统初始化的时候,会调用 makeDecorator('Component', {..}, Directive) 方法,创建 ComponentDecorator 工厂 。我们编写的 @component 组件转换成 ES 5 代码后,会使用用户自定义的 metadata 信息作为参数,自动调用 ComponentDecorator 工厂函数,该函数内部实现的主要功能就是创建 annotationInstance 对象,最后返回 TypeDecorator 类装饰器。该类装饰器会被 __decorate([...], AppComponent) 函数调用,参数 traget 就是我们要装饰的类 。
我有话说
window['__core-js_shared__']
对象的 metadata 属性中。感兴趣的话,大家可以直接在 Console 控制台,输入window['__core-js_shared__']
查看该对象内部保存的信息。总结
本文介绍了 Angular 2 中最常用的 ComponentDecorator 装饰器,并通过简单的例子,一步步分析该装饰器的内部工作流程。不过我们只介绍了 Angular 2 框架内部如何解析、创建及保存 metadata 信息,还未涉及到组件初始化的过程中,如何读取、应用组件对应的 metadata 信息。另外在后续的 Angular 2 DI 文章中,我们还会继续分析其它装饰器的工作原理。
The text was updated successfully, but these errors were encountered: