定义AngularJS Controller时使用数组表示法的原因

时间:2015-05-06 22:09:43

标签: javascript angularjs

如果这个问题听起来太明显,请道歉。

我最近开始探索和学习AngularJS。我已经阅读了一些很好的教程 -

..还有一些我见过的。

我不是说我读过/研究过所有文件。

问题从这里开始 -

现在,提出这个问题,我发现控制器的定义在一个地方是不同的,而在其他地方则不同 -

一个定义使用一种数组符号(不确定正式术语)进行注射:

app.controller("MyCtrl", ['$scope', function($scope){
    $scope.someData = "Array notation";
}]);

就是这样,没有数组:

app.controller("MyCtrl", function($scope){
    $scope.someData = "non-array notation";
});

不是说这是我唯一想要理解的东西,但是,我一定很想了解差异。

两者之间是否存在重大差异?

非常感谢。

注意:我确实在SO中搜索了类似的问题,但找不到我想要的内容。遗憾。

4 个答案:

答案 0 :(得分:24)

不同之处在于,当第二个被缩小时,参数名称将被缩小,并且angular将不再能够检查参数以确定要注入的依赖项。具有字符串中的依赖性的数组语法意味着它是最小安全的。

有一个名为ng-annotate的库,它将第二个示例更改为第一个示例,以便代码再次缩小安全性。

答案 1 :(得分:6)

两种方法之间没有太大区别。两个代码的工作方式相同。但是如果你使用第二个代码,那么在你缩小代码之后它会让你感到困惑。

寻找一个例子: -

  app.controller("MyCtrl", function(a){ ... });//$scope is changed to a

并且你的代码不会起作用,因为AngularJs代码使用$ scope变量,因为它没有采用第一,第二,第三等参数。

因此,第一个代码比第二个代码更安全,就好像当你缩小代码时,它仍将采用相同的变量,即$ scope。

寻找一个例子:

app.controller("MyCtrl", ['$scope', function(a){...}]);//a refers to $scope

因此,上面的代码在缩小代码时工作正常,因为$ scope被注入而不是a.So,如果你传递多个参数然后在这个例子中排序事项。

请看以下内容:

 app.controller("MyCtrl", ['$scope','$timeout' ,function(a,t){...}]);

其中 a 被注入为 $ scope t 被注入 $ timeout

因此,如果您更改传递的参数的顺序为

app.controller(" MyCtrl",[' $ timeout',' $ scope',function(a,t){...}]) ;其中 a $ timeout t $ scope

所以,在这个例子中排序很重要,但在你的第二个例子中,代码排序不会像名称那样重要,比如$ scope,$ timeout。

如果您使用下面的第一个示例代码,还有另一种注入变量的方法:

 MyCtrl.$inject = ['$scope'];

对于多个参数,

 MyCtrl.$inject = ['$scope','$timeout'];

因此,主要有三种注释:

  1. 隐式注释 - 您的第一个示例代码
  2. $ inject属性注释 - $ inject方法
  3. 内联数组注释 - 您的第二个示例代码
  4. 您可以详细了解here

答案 2 :(得分:1)

缩小时有所不同。如果你要缩小文件,就像你可能会提高性能一样,如果你使用选项二,可能会遇到问题。

由于Angular将控制器的依赖关系从参数名称推断到控制器的构造函数,如果你要缩小控制器的JavaScript代码,它的所有函数参数也会缩小,并且依赖注入器也不会能够正确识别服务。

所以从本质上说你最好使用第一个选项,更多的打字涉及但是它更安全,如果你缩小你的代码就不会破坏:-)

This是一个非常简短的教程,但很好地解释了它。

答案 3 :(得分:0)

我有一个庞大而复杂的AngularJS项目,因此手动更改所有代码将是一个很大的麻烦。但是我使用babel-plugin-angularjs-annotate解决了。

安装插件:

$ npm install babel-plugin-angularjs-annotate --save-dev

,然后将插件添加到.babelrc文件中:

{
  "presets": ["@babel/preset-env"],
  "plugins": ["angularjs-annotate"]
}