为什么angular的DI内联注释中的函数是一个数组元素?

dvc*_*crn 10 javascript arrays dependency-injection angularjs

我对这里的angularjs人提出了一个问题.

所以,我现在使用角度很长一段时间了.但是,每当我编写一个新的Controller或使用依赖注入的东西时,我发现自己错误地使用了内联定义.

someModule.controller('MyController', ['dep1', 'dep2', function (dep1, dep2) {
  ...
}]);
Run Code Online (Sandbox Code Playgroud)

我理解它是如何工作的,但为什么那些棱角分明的家伙没有决定采用更常见的方法呢?例如requirejs方式

someModule.controller('MyController', ['dep1', 'dep2'], function(dep1, dep2) {
  ...
});
Run Code Online (Sandbox Code Playgroud)

困扰我的是,第二个参数是一个依赖关系数组,并且回调是同时的最后一个元素.实际上,整个模块代码都是在最后一个数组元素中编写的.

将依赖项放在额外的数组中会不会更好?这样我们就可以轻松地将一组依赖项动态地传递给定义.

我觉得这很尴尬,但从未真正考虑过背后的原因.谁可以给我解释一下这个?

Mar*_*tin 10

我不知道这种语法背后的实际原因,但我认为它与一致性有关 - 你应该能够使用相同的语法,无论你需要注入服务的位置.

大多数地方使用的语法在你的例子:module.controller,module.factory等等.在这些地方的语法可以像蜂requirejs.

但是,在定义指令时,您还可以将服务注入其控制器.如果指令的控制器将被其他指令(例如ngModel指令)使用,则通常会执行此操作.

module.directive('myDirective', function () {
    return {
        controller: ['$scope', '$element', function ($scope, $element) {
            // ...
        }]
    };
});
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不能使用requirejs样式,但数组样式有效.我想这可能是语法原因之一.可能还有其他人.

作为旁注,您可以将指令的控制器定义为普通控制器,但这会使代码更加冗长,而且您可能会在指令之外的其他位置使用控制器.

module.controller('myDirectiveCtrl', ['$scope', '$element', function ($scope, $element) {
    // ...
}]);
Run Code Online (Sandbox Code Playgroud)

然后定义指令.

module.directive('myDirective', function () {
    return {
        controller: 'myDirectiveCtrl'
    };
});
Run Code Online (Sandbox Code Playgroud)