15

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 对我大喊大叫。

如何关闭它?

4

3 回答 3

8

只需编辑源代码。找到'function annotate',并将 fn == 'function' 块替换为如下内容:

if (typeof fn == 'function') {
  console.log("Bad magic injection in "+fn.toString().replace(STRIP_COMMENTS, ''));
}
于 2012-11-01T15:46:07.463 回答
4

更新:

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

恩敏。它是一个 AngularJS 应用程序缩小器项目。

不确定这是否有帮助。

根据伊戈尔·米纳尔的说法,

你应该做这样的事情

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

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

这是Dev guide的官方文档。

$inject 注解

为了允许 minifer 重命名函数参数并仍然能够注入正确的服务,函数需要使用 $inject 属性进行注释。$inject 属性是要注入的服务名称数组。

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

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

这种注解方法对于控制器声明很有用,因为它将注解信息分配给函数

于 2012-11-01T14:59:19.123 回答
3

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

文档

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

于 2014-06-16T11:59:05.407 回答