如何在angularjs中禁用自动注射器(注射器类型的魔术发现)?

Szy*_*ski 15 angularjs

Angularjs具有基于函数参数自动发现提供程序的这一很好的功能.例如,如果我想在某些函数中使用$ http,我会这样称呼它:

$inject.invoke(function ($http) {

});
Run Code Online (Sandbox Code Playgroud)

Angularjs将"知道"我的依赖项是什么.它将通过读取我的函数的主体并基于它将知道的参数名称来解决它.

但是,如果要缩小代码,则会出现问题.Minifier将更改参数名称.这就是为什么我们应该使用这种表示法:

$inject.invoke(['$http', function ($http) {}]);
Run Code Online (Sandbox Code Playgroud)

或者这个表示法:

function Foo ($http) {}
Foo.$inject = ['$http'];

$inject.invoke(Foo);
Run Code Online (Sandbox Code Playgroud)

我们应该总是最终缩小我们的代码.所以我们应该避免使用这种神奇的(第一个例子)表示法.

现在我的问题:

我正在尝试缩小我的js代码,angularjs无法解析提供者名称.我找不到一个我没有指定的地方.$inject = [...].现在它只是说:"Unknown provider a"我不知道它指的是什么功能.

是否可以关闭提供商的angularjs自动发现(自动注入)?我会在缩小之前测试并修复我的代码.

所以,我想知道如何禁用这个"神奇"的angularjs演绎.因为我总是缩小我的代码,所以当我不小心使用这个超级英雄的邪恶时,我希望angularjs对我大喊大叫.

如何关闭它?

And*_*lin 8

只需编辑源代码.找到'function annotate',并用这样的东西替换fn =='function'块:

if (typeof fn == 'function') {
  console.log("Bad magic injection in "+fn.toString().replace(STRIP_COMMENTS, ''));
}
Run Code Online (Sandbox Code Playgroud)


Ana*_*ran 3

从 1.3.0-beta.6 开始,angularjs 支持 ng-strict-di 选项,该选项可以与 ng-app 指令一起使用来禁用自动注入。

来自文档

如果应用程序元素上存在此属性,则注入器将以“strict-di”模式创建。这意味着应用程序将无法调用不使用显式函数注释的函数(因此不适合缩小),如依赖注入指南中所述,并且有用的调试信息将有助于追踪这些错误的根源