我使用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时有更好的理解和正确的方法。
请分享您对此的看法。谢谢!
答案 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"];