gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:33:58 24 4
gpt4 key购买 nike

也许这是一个糟糕的想法,但如果是这样,请告诉我原因,然后假装这是一项不会在生产中看到曙光的学术练习。

我想向 Angular $injector 服务添加一些逻辑,以监视某些服务何时注入(inject)其他服务。由于 Angular 似乎提供了一种装饰服务的机制,因此我认为这将是正确的选择。但是,以下代码会引发错误。

(function () {
'use strict';

var app = angular.module('app');

app.config(['$provide', function ($provide) {
$provide.decorator('$injector', ['$log', '$delegate', addLoggingToInjector]);
}]);

function addLoggingToInjector($log, $delegate) {
var baseInstantiate = $delegate.instantiate;
var baseInvoke = $delegate.invoke;

$delegate.instantiate = function (type, locals) {
// $log.debug('Calling $injector.instantiate');

baseInstantiate(type, locals);
};

$delegate.invoke = function (fn, self, locals) {
// $log.debug('Calling $injector.invoke');

baseInvoke(fn, self, locals);
};

return $delegate;
};
})();

具体错误是:

Uncaught Error: [$injector:modulerr] Failed to instantiate module app due to: Error: [$injector:unpr] Unknown provider: $injectorProvider

最佳答案

答案是:不。

<小时/>

$provide.decorator 用于拦截服务创建——这就是为什么当存在时从 .config block 调用它仍然有时间配置所有服务,因为还没有创建任何服务。 $provide.decorator 基本上获取服务的 Provider 并将其 $get 与新交付的 decorFn 交换。

$injector 与其他服务不同。它是作为引导应用程序的第一步创建的——在调用app.config之前。 [查看 Angular 源代码中的函数:bootstrapcreateInjector]

但是,嘿,您可以通过稍微调整源代码来轻松实现您的目标:-) 特别是看看function invoke(fn, self, locals)

<小时/>

更新我从@KayakDave 那里得到了一些灵​​感。实际上,您不必深入研究源代码本身。您可以使用以下模式来观察对任何 $injector 方法的每次调用:

 app.config(['$injector', function ($injector) {

$injector.proper =
{
get : $injector.get,
invoke : $injector.invoke,
instantiate : $injector.instantiate,
annotate : $injector.annotate,
has : $injector.has
}

function getDecorator(serviceName)
{
console.log("injector GET: ", serviceName);
return this.proper.get(serviceName);
}

function invokeDecorator(fn, self, locals)
{
console.log("injector INVOKE: ", fn, self, locals);
return this.proper.invoke(fn, self, locals);
}

function instantiateDecorator(Type, locals)
{
console.log("injector INSTANTIATE: ", Type, locals);
return this.proper.instantiate(Type, locals);
}

function annotateDecorator (fn)
{
console.log("injector ANNOTATE: ", fn);
return this.proper.annotate(fn);
}

function hasDecorator(name)
{
console.log("injector HAS: ", name);
return this.proper.has(name);
}

$injector.get = getDecorator;
$injector.invoke = invokeDecorator;
$injector.instantiate = instantiateDecorator;
$injector.annotate = annotateDecorator;
$injector.has = hasDecorator;
}]);
<小时/>

PLNKR

关于angularjs - Angular $injector 可以用 $provide.decorator 装饰吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20551277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com