AngularJS控制器:正确的方法

时间:2014-02-28 19:53:26

标签: javascript angularjs testing web-applications

所以,我一直在与同事讨论创建AngularJS控制器的“正确方法”。我知道有几种创建方法,但我有兴趣让我的团队以同样的方式和“正确”的方式编写它们。通过“正确的方式”,我所说的易于阅读,可测试和高效。我确信在创建控制器的最佳方法上存在竞争理论,但我最感兴趣的是在一天结束时的测试能力,因为这是AngularJS的良好构建。

不用多说,这里是竞争者:

我们假设我们的应用被声明为: var app = angular.module('app',[]);

1

app.controller('myCtrl', function(){
  ...
});

2

function myCtrl = {
  ...
}
app.controller('Ctrl', myCtrl);

第3

(function(app) {
  app.controller('myCtrl', function() {
    ...
  }
})(app);

如果我错过了,请告诉我。

这不会考虑缩小所需的更改 所以请不要将其添加到此对话中。

谢谢! (我希望这不会引发火焰战争><)

3 个答案:

答案 0 :(得分:1)

我的团队专门使用1.我也考虑了3,我们只有一个关于全局级代码的常规规则(和jshint约束)。我永远不会用2。

答案 1 :(得分:1)

我总是这样做:

angular.module('myModule').controller('MyController', ['$scope', function($scope) {

   <stuff>

}]);

是的,它稍微冗长一点,但它在全局范围内没有任何创造,很清楚控制器属于哪个模块,如果我需要将我的控制器分成另一个文件,我只需复制并通过它而不用担心app&#39;定义或关于我是否错过了&#39;。在链式声明中。

我知道我应该忽略它,但当然这个版本是缩小安全的。

总的来说,我相信你应该找到一个明确的标准并坚持下去。那样的话,如果有什么东西看起来没有&#34;对&#34;你可以马上告诉。

答案 2 :(得分:0)

Angular团队最近发布了最佳实践指南,因此可能是一个很好的起点:http://blog.angularjs.org/2014/02/an-angularjs-style-guide-and-best.html。此演示文稿还讨论了有关创建控制器的一些最佳实践:https://docs.google.com/presentation/d/1OgABsN24ZWN6Ugng-O8SjF7t0e3liQ9UN7hKdrCr0K8/present?pli=1&ueb=true&slide=id.p

如果你使用的是数字2,那么你真的不需要app.controller('Ctrl', myCtrl);。您可以从ng-controller引用控制器,即使它未使用module.controller(...)

定义

你可能还想考虑让你的控制器和javascript允许的“类”一样,并使用'controller as'语法。

var myApp = angular.module("myApp", []);

myApp.MyCtrl = function($log) {
    this.$log = $log;
}

myApp.MyCtrl.prototype.sayHello = function() {
    this.$log('hello');
}

有些情况下,您可以全局访问控制器。就像你想用$ injector.instantiate()创建一个控制器实例一样,你需要访问它的构造函数(尽管你可以使用$ controller服务来使用字符串来实现相同的目标)。

var myCtrl = $injector.instantiate(myApp.MyCtrl); //Works
var myCtrl2 = $injector.instantiate('MyCtrl'); //Doesn't Work

但是如果你没有一个特定的用例来使你的控制器全局化,你应该用module.controller(...);封装它们。

此答案还提倡使用module.controller() https://stackoverflow.com/a/13363482/373655