我很好奇AngularJS中究竟是什么装饰者。除了AngularJS documentation中的模糊信息和youtube video中的简短(尽管有趣)提及之外,还没有很多关于装饰者的在线信息。
正如Angular家伙所说的那样,装饰者是:
服务的装饰,允许装饰者拦截服务 实例创建。返回的实例可能是原始实例, 或者委托给原始实例的新实例。
我真的不知道意味着什么,而且我不确定为什么要将这个逻辑与服务本身分开。例如,如果我想在不同条件下返回不同的东西,我会将不同的参数传递给相关函数,或者使用另一个共享该私有状态的函数。
我仍然是一个AngularJS菜鸟,所以我确定它只是无知和/或我已经习惯的坏习惯。
答案 0 :(得分:216)
$provide.decorator
的一个很好的用例是当你需要对你的模块所依赖的某些第三方/上游服务进行轻微的“调整”,同时保持服务的完整性(因为你不是所有者) /维护者的服务)。 Here是关于plunkr的演示。
答案 1 :(得分:66)
装饰者允许我们将跨领域的问题分开,并允许服务保留单一责任原则,而不必担心“基础设施”代码。
装饰者的实际用途:
在所有这些情况下,我们将服务中的代码限制为其主要职责。
答案 2 :(得分:10)
decorator
可以截取factory, service, value, provider
创建的服务实例,并提供更改某些instance(service)
的选项,否则这些选项无法配置/选项。
它还可以提供用于测试目的的模拟实例,例如$http
。
答案 3 :(得分:3)
简单来说,我们可以说它就像一个扩展方法。对于Ex。我们有一个类,它有两个方法,在运行时我们想在其中添加更多方法然后我们使用Decorator。
我们不能将$ provide.decorator与常量一起使用,因为我们无法更改它们只读属性的常量。
答案 4 :(得分:1)
简而言之,装饰者可以描述如下: -
装饰器功能拦截服务的创建,允许它 覆盖或修改服务的行为。
它通过角度使用$provide
服务并修改或替换另一个服务的实现
$provide.decorator('service to decorate',['$delegate', function($delegate) {
// $delegate - The original service instance,
// which can be replaced, monkey patched,
// configured, decorated or delegated to.
// ie here what is there in the 'service to decorate'
// This function will be invoked,
// when the service needs to be provided
// and should return the decorated service instance.
return $delegate;
}]);
示例:
$provide.decorator('$log', ['$delegate', function($delegate) {
// This will change implementation of log.war to log.error
$delegate.warn = $delegate.error;
return $delegate;
}]);
应用程序
除了@JBland回答。