理解Angularjs中的编码风格

时间:2013-09-11 06:27:58

标签: angularjs

我使用Angularjs遇到了不同的编码风格,这让我想到了每种编码风格的优缺点。

例如。 声明控制器:

风格#1

angular.module('mainCtrl', []);
function MainCrl($scope, $rootScope) {}

风格#2

angular.module('mainCtrl',[])
.controller('MainCtrl', function($scope, $rootScope)) { ... });

风格#3

angular.module('mainCtrl',[])
.controller('MainCtrl', ['$scope', '$rootScope', function(scope, rootScope)) { ... }]);

因此样式#3有点像使用别名,当你打算写一个testscript(单元测试)时,使用别名会产生影响吗?我只是想在使用Angularjs Framework时有更好的理解和正确的方法。

请分享您对此的看法。谢谢!

2 个答案:

答案 0 :(得分:14)

样式#1表示控制器在模块外定义为全局,对于小型测试项目,但对于任何认真的工作,一切都应该使用#2或#3完成。 #2和#3之间的区别是#3是可缩小的,因为$ scope和$ 2中的$ rootScope名称通常会被优化掉,这会导致应用程序失败。 #3将这些存储为不会缩小的字符串。

如果您至少有可能缩小代码,请转到#3。使用#1而不是#2几乎没什么意义,所以我倾向于完全避免#1。

答案 1 :(得分:0)

所有这些都是有效的,但是暴露全局函数通常不是一个好主意(名称可能会发生冲突),最好将这些函数封装在angular自己的域中。

这使得风格#2。

AngularJS使用dependency injection来提供其他服务,过滤器,控制器等。这是通过查看函数参数,通过正则表达式获取它们并在必要时提供它们来完成的。

但是,当你缩小时会发生什么?为了摆脱额外的字节,minifiers重命名函数中的变量和参数,因为它不会改变任何东西,如果我们不偷看得到函数的参数,一切都会工作。

缩小时,例如$rootScope变为a,它会抛出错误,就像没有aProvider一样,是的,这是正确的。

因此,angular有另一种语法,它是数组符号;您可以定义一个具有依赖项名称后跟实现函数的数组,而不是定义函数。

所以,

angular.controller("MainCtrl", ["$scope", "$routeParams", function (a,b) {
    // a == $scope
    // b == $routeParams
}]);

还有其他方法可以做到这一点,而不是定义一个数组。您可以将函数的$ inject属性设置为数组。

function MainCtrl(a,b) {
    // a == $scope
    // b == $routeParams        
}
MainCtrl.$inject = ["$scope", "$routeParams"];

有关详细信息:http://docs.angularjs.org/guide/di