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



我有一个问题要问这里的angularjs人。

所以,我使用角度已经有一段时间了。但是,每次当我编写新的控制器或使用依赖注入的东西时,我都会发现自己写错了内联定义。

someModule.controller('MyController', ['dep1', 'dep2', function (dep1, dep2) {
  ...
}]);

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

someModule.controller('MyController', ['dep1', 'dep2'], function(dep1, dep2) {
  ...
});

困扰我的是,第二个参数是一个依赖项数组回调同时作为最后一个元素。实际上,整个模块代码都写在最后一个数组元素中。

将依赖项放在一个额外的数组中不是更好吗?这样,我们可以轻松地将依赖项数组动态传递到定义中。

我觉得这很尴尬,但从未真正考虑过背后的原因。有人可以向我解释一下吗?

我不知道

这种语法背后的实际原因,但我认为这与一致性有关 - 无论您需要在何处注入服务,您都应该能够使用相同的语法。

大多数地方在您的示例中使用语法:module.controllermodule.factory等。在这些地方,语法可以像requirejs一样。

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

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

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

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

module.controller('myDirectiveCtrl', ['$scope', '$element', function ($scope, $element) {
    // ...
}]);

然后定义指令。

module.directive('myDirective', function () {
    return {
        controller: 'myDirectiveCtrl'
    };
});

您不必再将语法与数组一起使用。您可以像这样编写代码:

module.directive('myDirective', function () {
    return {
        controller: function ($scope, $element) {
            // ...
        }
    }
});

在此处阅读更多内容

最新更新