截至最近,我一直在以下列方式为我的angularJS控制器声明函数和属性(app设置为主应用程序角度模块):
app.controller('myController', ['$scope', function($scope) {
$scope.myProperty = "hello world";
$scope.myFunc = function() {
// do stuff
};
}]);
过了一会儿控制器' $ scope增长到包含许多实用程序函数和属性,这些函数和属性未在我的视图中直接使用,并且不适用于其他控制器,因此我将其更改为:
app.controller('myController', ['$scope', function($scope) {
var myProperty = 0, addOne;
addOne = function(i) {
return i++;
};
$scope.myFunc = function() {
myProperty = addOne(myProperty);
// do other stuff
};
}]);
这工作正常但是可以按照上面显示的方式声明函数和属性,还是应该将它们提取到服务中?我可以从jasmine / karma中对我的控制器中的var声明函数进行单元测试(尝试但没有成功)?什么是最好的模式?
我已经开始使用'这个'用于完成上述相同操作的关键字,但我不认为增加的值会超过将所有内容转换为此模式所需的时间。如果这是完全错误的,请建议更好的策略。
---更新---
回答我自己关于在控制器中测试var声明函数的问题:How can we test non-scope angular controller methods?
答案 0 :(得分:3)
作为一般规则,如果您不打算在视图中使用变量或函数,请不要将其附加到范围。因此,基于它的使用,在控制器或范围内声明您的变量和函数。你不想在$ scope上加入不必要的东西,因为这会减慢摘要周期。作为最佳实践,我在控制器中遵循以下格式:
app.controller('MainCtrl', function($scope) {
// controller variables
var age = 123;
// scope variables
$scope.name = 'John';
// controller functions
var helloWorld = function() {
console.log('do work');
}
// scope functions
$scope.isOld = function() {
return age > 50;
}
});
答案 1 :(得分:0)
服务是单身,而控制者则不是。 此外,服务用于在许多不同的控制器/指令之间共享功能。 您的第二个代码块看起来对我来说非常好,因为您不需要在应用程序的其他位置共享内部控制器特定功能,而且比将不需要的东西放在示波器中要好得多。