如果这个问题听起来太明显,请道歉。
我最近开始探索和学习AngularJS。我已经阅读了一些很好的教程 -
..还有一些我见过的。
我不是说我读过/研究过所有文件。
问题从这里开始 -
现在,提出这个问题,我发现控制器的定义在一个地方是不同的,而在其他地方则不同 -
一个定义使用一种数组符号(不确定正式术语)进行注射:
app.controller("MyCtrl", ['$scope', function($scope){
$scope.someData = "Array notation";
}]);
就是这样,没有数组:
app.controller("MyCtrl", function($scope){
$scope.someData = "non-array notation";
});
不是说这是我唯一想要理解的东西,但是,我一定很想了解差异。
两者之间是否存在重大差异?
非常感谢。
注意:我确实在SO中搜索了类似的问题,但找不到我想要的内容。遗憾。
答案 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'];
因此,主要有三种注释:
您可以详细了解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"]
}