【问题标题】:Difference between AngularJS(1.x) and Angular (2/4) DecoratorAngularJS(1.x) 和 Angular (2/4) 装饰器的区别
【发布时间】:2018-02-14 12:20:05
【问题描述】:

我开始使用 Angular 版本 2 并遇到了 @Component Decorator。我记得 AngularJS(1.x) 也有一个装饰器的概念,它用于扩展/更改任何服务的默认实现。

似乎在 Angular 2 中,它们不是更改/扩展默认功能,而是将元数据添加到从类(使用 @Component)到属性(使用 Input()/Output() 装饰器)的范围内,并且列表如下用于管道和服务等。

有人可以提供两者之间的差异(如果有的话)吗? 概念/实际工作。

谢谢。 迪帕克

【问题讨论】:

  • 除了名字,基本没有什么共同点。 AngularJS 装饰器是一个很少使用的功能,它允许包装/代理现有服务。 TypeScript 装饰器允许注释代码的各个部分以提供元数据,并且它们在 Angular 中的任何地方都用于定义组件、服务、管道、模块等。不要试图将一个与另一个视为相同的东西。跨度>
  • @JBNizet - 我明白你的意思。但我认为 Angular 2 装饰器是 ES 2015 的特性而不是 TypeScript 特性,是真的吗?
  • 没有。 ES 中不存在装饰器(目前)。

标签: angularjs angular angular2-decorators


【解决方案1】:

AngularJS

AngularJS 装饰器是一个OOP pattern

AngularJS 中很少使用它来扩展内置对象的行为。比如下面的implementation使用$provider.decorator()拦截$log.debug()调用,动态前置时间戳信息。

$provide.decorator('$log', [
    "$delegate", function ($delegate) {
        // Save the original $log.debug()
        var debugFn = $delegate.debug;

        $delegate.debug = function () {
            var args = [].slice.call(arguments),
                now = DateTime.formattedNow();

            // Prepend timestamp
            args[0] = supplant("{0} - {1}", [now, args[0]]);

            // Call the original with the output prepended with formatted timestamp
            debugFn.apply(null, args)
        };

        return $delegate;
    }
]);

角度

Angular 装饰器是a language-feature

提供了一种方便的声明式语法来修改类的形状 声明。此功能可用于多种用途 包括修改声明成员的描述符 (@nonconfigurable/@enumerable),添加元数据(Angular 使用的), 和更多。它允许附加访问

Angular 使用它将元数据附加到类、类成员(属性)和方法参数。要了解 Angular 是如何做到这一点的,请阅读 Implementing custom component decorator in Angular

在大于 4 的版本中,Angular 将不再在运行时动态评估装饰器,并将使用静态代码分析来提取装饰器描述符中指定的元数据。

【讨论】:

  • 感谢您的示例。但正如官方 AngularJS 文档中所述:什么是装饰器?装饰器是一种设计模式,用于在不修改原始源代码的情况下单独对类进行修改或装饰。在 AngularJS 中,装饰器是允许在使用服务、指令或过滤器之前对其进行修改的功能。可能是我使用了错误的动词:“扩展”,而应该是更改/修改服务的现有行为。就像您在上面的示例中所做的那样,您已经修改了 $log 服务的现有行为以现在添加时间戳。
  • @DeepakPathak,不客气,如果有的话,我不太明白你的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2018-02-25
  • 2011-06-06
  • 2016-06-12
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
相关资源
最近更新 更多