Angular $ injector可以用$ provide.decorator装饰吗?

Angular $ injector可以用$ provide.decorator装饰吗?,第1张

Angular $ injector可以用$ provide.decorator装饰吗?

您不能在$ 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"]

演示小提琴



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5646467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存