我不清楚decorator
究竟如何与角度$injector
一起使用,所以任何解释都是有帮助的。
考虑我的myTempService
:
$provide.decorator('myTempService', function($delegate) {
$delegate.controller = // some service to get the current controller
return $delegate;
});
当myTempService
注入我的控制器时,我需要myTempService.controller
作为控制器的名称:
.controller('MainCtrl', function (myTempService) {
console.log(myTempService.controller); // MainCtrl
});
答案 0 :(得分:0)
当您使用.value()
,.service()
,.factory()
和.provider()
注册服务时,您传入的内容作为第二个参数实际上将最终作为服务提供商构造函数的一部分。
当angular的引导过程开始时,每个注册的服务提供者构造函数将用于创建服务提供者实例。
在配置阶段,服务提供程序实例可以注入,您可以使用它们来更改要创建的服务实例的默认配置。
angular.module('myApp').config(function ($httpProvider) {
// $httpProvider is a provider instance of the $http service
$httpProvider.interceptors.push(function () {});
});
在进入运行阶段之前,每个服务提供商实例都将用于创建服务实例。
然后装饰器将在此时发挥作用。在将这些服务实例用于注入各个地方之前,每个服务实例将作为$delegate
参数传递到其注册的装饰器中(如果有的话)。 将使用装饰器函数的结果而不是
原始服务实例。
angular.module('myApp').config(function ($provide) {
$provide.decorator('$http', function ($delegate) {
// monkey patching
var originalGet = $delegate.get;
$delegate.get = function () {
console.log('$http.get is called');
return originalGet.apply(this, arguments);
};
return $delegate;
});
});
因此,在装饰器功能中,您可以选择:
最后,服务实例可用于注入所有地方,例如:在应用程序的整个生命周期中运行块,控制器,指令,过滤器等。