您不能在$ injector上使用Angular装饰器服务。正如Artur所说,
$injector它与其他服务有些不同。但是我们可以创建自己的装饰器。为什么我们不能使用Angular的装饰器
在代码级别,问题在于
$injector没有构造函数-没有
$injectorProvider。
例如,这两个都返回true:
$injector.has('$location');$injector.has('$locationProvider')
但是,虽然返回true:
$injector.has('$injector')
这将返回false:
$injector.has('$injectorProvider')
当我们查看Angular装饰器函数时,我们看到了重要性:
function decorator(serviceName, decorFn) { var origProvider = providerInjector.get(serviceName + providerSuffix), orig$get = origProvider.$get; origProvider.$get = function() { var origInstance = instanceInjector.invoke(orig$get, origProvider); return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); };}
和
providerSuffix = 'Provider'
因此,Angular装饰器希望在服务的构造函数(
serviceName + providerSuffix)上进行 *** 作。实用上,
由于没有
$injectorProvider, 所以 不能使用decorator 。解
我们可以做的是自己替换Angular注入器的
get功能,方法是将注入器的默认值替换为
get调用原始Angular定义的默认值,然后调用
get我们的函数。
我们将其应用到
$injector而不是
$injectorProvider像这样不存在的应用:
app.config(['$provide','$injector', function ($provide,$injector) { // The function we'll add to the injector myFunc = function () { console.log("injector called ", arguments); }; // Get a copy of the injector's get function var origProvider = $injector, origGet = origProvider.get; //Override injector's get with our own origProvider.get = function() { // Call the original get function var returnValue = origGet.apply(this, arguments); // Call our function myFunc.apply(this,arguments); return returnValue; }}]);
您会看到注入的提供程序是第一个扩充,因此会
app.value('aValue', 'something');产生以下日志语句:
injector called ["aValueProvider"]
演示小提琴
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)