Angularjs Angular JS-使用控制器名称装饰服务
我不清楚Angularjs Angular JS-使用控制器名称装饰服务,angularjs,angularjs-service,Angularjs,Angularjs Service,我不清楚decorator如何与angular$injector配合使用,所以任何解释都是有帮助的 考虑到我的myTempService: $provide.decorator('myTempService', function($delegate) { $delegate.controller = // some service to get the current controller return $delegate; }); 当myTempService被注入我的控制器时,我需
decorator
如何与angular$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
});
使用
.value()
、.service()
、.factory()
和.provider()
注册服务时,作为第二个参数传入的内容实际上将作为服务提供程序构造函数的一部分结束
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;
});
});
当angular的引导过程开始时,每个注册的服务提供程序构造函数将用于创建一个服务提供程序实例
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;
});
});
在配置阶段,可以插入服务提供程序实例,您可以使用它们更改要创建的服务实例的默认配置
angular.module('myApp').config(function ($httpProvider) {
// $httpProvider is a provider instance of the $http service
$httpProvider.interceptors.push(function () {});
});
在进入运行阶段之前,每个服务提供商实例都将用于创建一个服务实例
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;
});
});
此时,装饰师将开始工作。在将这些服务实例用于注入到各个位置之前,每个服务实例将作为$delegate
参数(如果有)传递到其注册的装饰器中将使用decorator函数的结果,而不是
原始服务实例
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;
});
});
因此,在decorator函数中,您可以选择:
- 只需执行一些操作并返回原始服务实例,例如打印出一些用于调试的内容
- 设置由于某些原因无法在配置阶段完成的服务初始值
- Monkey修补原始服务实例并将其返回
- 在原始服务实例上创建并返回包装器/代理服务
- 在单元测试中,您可以返回一个mock/spy对象
最后,在应用程序的整个生命周期中,服务实例将可用于注入所有位置,例如运行块、控制器、指令、过滤器等。是的,感谢您清除其中的一些内容。也许我应该问,我如何截取$injector放入控制器的实例,以便我用一些值来扩充这个实例,这些值可以用来将它与控制器关联。我不确定我是否正确理解了您的问题。对于每个服务,服务实例将只创建一次,并且这个唯一相同的实例将被注入到任何请求它的对象中。所以不可能知道哪个控制器在decorator函数中请求服务。是的,这是我的问题。谢谢你澄清这一点-这是不可能的,所以使用$decorator似乎没有任何好的答案。非常感谢。