控制器使用正常功能或数组表示法

时间:2015-07-08 03:24:42

标签: angularjs

这两者之间有什么区别:

angular.module('myapp' ,[])
.controller('MyController', function($scope){...});

angular.module('myapp' ,[])
.controller('MyController, ['$scope', function($scope){...})];

对于像我这样刚接触AngularJS的人来说,这非常复杂。语法与Java和C的区别太大。

非常感谢。

2 个答案:

答案 0 :(得分:13)

它们之间没有任何区别。两个代码的工作方式相同。但是,如果你使用第一个代码,当你缩小代码时,它会混淆。

寻找一个例子:

.controller('MyController', function(a){...});//$scope is changed to a

并且您的代码将无法工作,因为angularjs代码使用$ scope变量,因为它不接受第一,第二,第三等参数。

所以,第二个代码比第一个代码更安全,就好像当你缩小代码时,它仍然需要相同的变量,即$ scope。

寻找一个例子:

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

因此,上面的代码在缩小代码时工作正常,因为$ scope被注入代替a。因此,如果您传递多个参数,那么在此示例中排序很重要。请看以下内容:

.controller('MyController', ['$scope','$timeout', function(s,t){...})]; s作为$ scope注入,t作为$ timeout注入。因此,如果您更改它们的顺序,如['$timeout','$scope', function(s,t){...})],那么s是$ timeout,t是$ scope。因此,在这个示例中排序很重要,但在第一个示例中,代码排序无关紧要,因为名称很重要,例如$ scope,$ timeout。

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

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

对于多个参数,

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

因此,主要有三种annotation

  1. 隐式注释 - 您的第一个示例代码
  2. $ inject属性注释 - $ inject方法
  3. 内联数组注释 - 您的第二个示例代码

答案 1 :(得分:2)

第二个是缩小安全。

  

因为Angular从名称中推断出控制器的依赖关系   控制器的构造函数的参数,如果你是   缩小PhoneListCtrl控制器的JavaScript代码,全部   函数参数也将被缩小,并且依赖性   注入器无法正确识别服务。

Source