为什么 Angular 2 使用装饰器?

Why does Angular 2 use decorators?

我刚开始使用 Angular 2 并且想知道为什么像 selectortemplate 这样的属性放在组件装饰器中而不是组件 类.

在 Angular 2 中使用所有这些装饰器有什么意义?

  • 使工具可以轻松地在模板中提供各种支持,例如:

    • 错误检查
    • 自动完成
    • 图形 GUI 设计师
  • 从装饰器生成代码,允许:

    • 更明确地定义一些东西或
    • 根据某些配置生成不同的代码(就像 即将推出的 离线模板编译器所做的那样)

需要执行代码才能使用表达式可能发出的结果。无需执行 TypeScript 代码即可轻松静态评估装饰器(可能是简单且有限的子集除外)。

一般来说,装饰器允许你执行函数。例如 @Component 执行从 Angular2 导入的 Component 函数。在幕后,此类装饰器在 class 上定义了一些元数据。这允许您将 class 到 "flag" 配置为一个组件。然后 Angular2 能够 link 模板中的选择器到这样的 class.

这篇文章可以为您提供更多关于幕后情况的提示:

您会注意到装饰器可以在不同级别(class、class 属性、方法参数)应用到 TypeScript 中。

除了已经存在的特定于平台的答案之外,我还想从更通用的角度参与进来。在我看来,这个问题在某种程度上与选择装饰器模式而不是继承的决定有关(例如 @Component vs extends Component

使用装饰器的一些好处是:

1.关注点分离:

装饰器中的信息是声明性的,它们定义了 class 的行为,很可能不会随时间改变并由框架使用。 Class 属性和字段是 class 特定的数据,将始终被处理并经常更新,并且仅在 class 本身内有意义。这两种数据不能混在一起。

2。支持多次修改

许多语言由于 Diamond problem 而阻止多重继承。另一方面,一个 class 可以有多个用于不同目的的装饰器(例如 @Component 和已弃用的 @RouteConfig

在 angular 中,我们为组件、服务、指令等所有内容创建 classes,

那么,angular 编译器如何编译您的代码并将其转换为可在浏览器中 运行 使用的脚本?发生这种情况是因为装饰器。简而言之,您可以说装饰器允许您使用打字稿 class 附加元数据,使用它 angular 知道 class 是组件、指令还是模块等。

Decorator 将 class 标记为 Angular 组件,并提供配置来确定组件在运行时应如何处理、实例化和使用。它提供了各种选项来配置它,例如选择器、templateUrl、模板、styleUrls、样式、提供程序等。