Angular中方括号用法的用途是什么?

我想了解MyOtherServiceMyOtherComplexService的声明之间的MyOtherComplexService 。 尤其是方括号部分的用途是什么? 什么时候使用它们,什么时候使用?

 var myapp = angular.module('myapp', []); myapp.factory('MyService', function($rootScope, $timeout) { return { foo: function() { return "MyService"; } } }); myapp.factory('MyOtherService', function($rootScope, $timeout, MyService) { return { foo: function() { return "MyOtherService"; } } }); myapp.factory('MyOtherComplexService', ['$rootScope', '$timeout', 'MyService', function($rootScope, $timeout, MyService) { return { foo: function() { return "MyOtherComplexService"; } } }]); myapp.controller('MyController', function($scope, MyOtherService, MyOtherComplexService) { $scope.x = MyOtherService.foo(); $scope.y = MyOtherComplexService.foo(); }); 

它使AngularJS代码被缩小。 AngularJS使用参数名称将值注入到控制器函数中。 在JavaScript缩小过程中,这些参数被重命名为更短的string。 通过告诉用string数组注入哪个参数,AngularJS仍然可以在重命名参数时注入正确的值。

添加到Ufuk的答案 :

ngmin – 将您的标准模块编译为最小安全模块

Angular的min-safe方括号表示法不太方便,因为您必须键入每个依赖项两次,而且参数顺序很重要。 有一个名为ngmin工具 ,它把你的标准模块编译成最小安全模块 ,所以你不必手工pipe理所有这些东西。

Angular + CoffeeScript

如果您使用的是CoffeeScript,情况会更糟糕 。 你可以在ngmin之间进行select,这会破坏你的源代码地图 ,或者如果你想自己写出来,你必须用方括号包装你的整个代码 ,这是非常丑陋的。

 angular.module('whatever').controller 'MyCtrl', ['$scope', '$http' , ($scope, $http) -> # wrapped code ] 

在我看来,这不是CoffeeScript的缺陷,而是Angular团队的一个糟糕的devise决定,因为它违背了所有JS / CoffeeScript约定没有作为最后一个参数的function。 足够的咆哮,这是一个小帮手的function来解决它​​:

 deps = (deps, fn) -> deps.push fn deps 

这是一个非常简单的函数,它接受两个参数。 第一个是包含你的依赖关系的string数组,第二个是你的模块的function。 你可以像这样使用它:

 angular.module('whatever').controller 'MyCtrl', deps ['$scope', '$http'] , ($scope, $http) -> # unwrapped code \o/ 

只是为了举例说明,如果你使用下面的语法:

 myapp.factory('MyService', function($scope, $http, MyService) { ... }); 

大多数JS缩小器会将其更改为:

 myapp.factory('MyService', function(a, b, c) { ... }); 

因为函数参数名称通常可以重命名为较短的名称。 这将打破Angular的代码。

在Angular中,为了让你的代码在所有的minifiers中变得更小,你可以使用括号语法:

 myapp.factory('MyService', ['$scope', '$http', 'MyService', function($scope, $http, MyService) { ... }]); 

这将被缩小为:

 myapp.factory('MyService', ['$scope', '$http', 'MyService', function(a, b, c) { ... }]); 

请注意,缩小器不会触及string,所以Angular将依次查看缩小的代码和匹配参数:

 $scope = a $http = b MyService = c 

为了避免这个丑陋的方括号语法,你应该使用像ng-annotate这样的智能缩小器。

截至目前,ng-min已被弃用。 改用ng-annotate 。

在构build作业中使用ng-annotate是一个很好的习惯,所以开发时不必处理min-safe /括号表示法,因为这会使代码更难读取和维护。

在npm上有一个grunt-plugin和gulp插件 。