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

时间:2012-11-01 11:48:34

标签: angularjs

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

$inject.invoke(function ($http) {

});

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

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

$inject.invoke(['$http', function ($http) {}]);

或这种表示法:

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

$inject.invoke(Foo);

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

现在我的问题是:

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

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

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

如何关闭它?

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

更新

如果有人因为试图缩小而需要这个,也许这是另一种可能的解决方案

ngmin。这是一个AngularJS应用程序缩小器项目。

不确定这是否有帮助。

根据Igor Minar的说法,

你应该做这样的事情

factory('Phone', function($resource){ ... }))

factory('Phone', ['$resource', function($resource){ ... })])

以下是Dev guide的官方文档。

  

$ inject Annotation

     

允许minifers重命名函数参数仍然是   能够注入正确的服务功能需要注释   $ inject属性。 $ inject属性是一个服务数组   要注射的名字。

var MyController = function(renamed$scope, renamedGreeter) {
...
}
MyController.$inject = ['$scope', 'greeter'];
     

必须注意$ inject注释与之保持同步   函数声明中的实际参数。

     

这种注释方法对于控制器声明非常有用   它使用函数

分配注释信息

答案 2 :(得分:3)

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

来自Documentation

  

如果app元素上存在此属性,则注入器将为   以“严格 - 迪”模式创建。这意味着应用程序将失败   调用不使用显式函数注释的函数(和   因此不适合缩小),如依赖性中所述   注射指南和有用的调试信息将有助于跟踪   在这些错误的根源