保持$ inject同步是什么意思?

时间:2015-08-20 14:43:20

标签: angularjs dependency-injection

我正在阅读the Angular docs about injecting dependencies,并试图找出“同步”意味着什么。

如同,保持“同步”与保持“同一顺序”之间的区别是什么?文档似乎暗示它们之间存在一些差异。

上下文:

关于内联数组表示法

使用此类注释时,请注意使注释数组与函数声明中的参数保持同步。

关于 $inject属性注释

在这种情况下,$inject数组中值的排序必须与MyController中参数的顺序相匹配。

就像数组注释一样,您需要注意保持$inject与函数声明中的参数同步。

1 个答案:

答案 0 :(得分:2)

'同步'和'按顺序'在这种情况下意味着相同的事情。

除了Implicit Annotation 之外的所有情况下,顺序都很重要(但是在缩小/丑化期间隐式定义的函数会中断)

从这里可以看出:

app = angular.module('myApp', []);
// Inline Array Notation where we are defining the dependencies in the opposite order of what the function is defined as
app.controller('myInlineCtrl', ['$http', '$scope', function ($scope, $http) {
    $scope.testVal = '$scope passed as $scope';
    $http.testVal = '$http passed as $scope';
    // results in `$http passed as $scope`
}]);

// $inject Property Annotation
var myInjectorCtrl = function ($scope, $http) {
    $scope.testVal = '$scope passed as $scope';
    $http.testVal = '$http passed as $scope';
    // results in `$http passed as $scope`
}
// Inject the dependencies in the opposite order
myInjectorCtrl.$inject = ['$http', '$scope'];
app.controller('MyInjectorCtrl', myInjectorCtrl);

上述测试表明,我们必须遵循注入的顺序而不是函数定义中参数的顺序。这与能够使用您希望的任何参数名称(在合理范围内)定义函数是一致的,这样当它到达应用程序的minification时,函数本身可以被压缩,但仍然使用正确的参数调用

这方面的一个例子是:

// Define a controller with your own argument names
app.controller('myMickeyMouseCtrl', ['$http', '$scope', '$timeout', function (mickey, donald, daffy) {
    mickey.testVal = 'mickey passed as $scope';
    donald.testVal = 'donald passed as $scope';
    daffy.testVal = 'daffy passed as $scope';
    // results in `donald passed as $scope`
}]);

所有三个http://jsfiddle.net/6qh2oyu6/

的演示

重要的是要注意,如果您在定义它之后定义myInjectorCtrl.$inject = ['$timeout'];,您将清除为该Controller函数存储的注入,在这种情况下,只有角度$timeout函数才会生成注入。