【发布时间】:2013-12-17 05:04:32
【问题描述】:
也许这是一个糟糕的想法,但如果是这样,请告诉我原因,然后假装这是一项不会在生产中看到曙光的学术活动。
我想为 Angular $injector 服务添加一些逻辑,以监控某些服务何时注入其他服务。由于 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;
};
})();
具体错误是:
未捕获的错误:[$injector:modulerr] 无法实例化模块应用程序 由于:错误:[$injector:unpr] 未知提供者:$injectorProvider
【问题讨论】:
-
你找到方法来检测你注入的服务了吗?
-
是的。我向 ng 模块添加了一个运行函数,该函数接受 $injector 作为参数并覆盖服务上的方法。我基本上遵循下面@KayakDave 提出的模式。
-
您能否检测到,例如,您将
$log注入MyCtrl?或者只是你正在注入$log? -
只有我在注入 $log。但是,如果你重写$controllerProvider的注册函数,你可以在injectable上记录控制器的名字。然后当注入器收到它时,您可以提取名称并知道您要注入的内容。但是,要使其正常工作,您需要在声明任何控制器之前覆盖 register 方法,因为这一切都发生在配置时。
-
酷,谢谢!正在考虑自动将控制器信息添加到日志服务。
标签: angularjs