2014-02-28 69 views
1

因此,我一直在与同事讨论创建AngularJS控制器的“正确方法”。我知道有几种创建方法,但我有兴趣让我的团队以同样的方式和“正确”的方式写他们。通过“正确的方式”,我正在谈论易读,可测试和高性能。我确信有关于创建控制器的最佳方法的竞争理论,但是我最感兴趣的是在一天结束时的测试能力,因为这是AngularJS的成就。AngularJS控制器:正确的方法

事不宜迟,这里的竞争者:

让我们假设我们的应用程序被宣布为这样:var app = angular.module('app',[]);

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

2.

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

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

请让我知道如果我错过了一个。

这并没有考虑到,所以请不要在添加到此对话需要缩小的变化。

谢谢! (我希望这不会开始一场火焰战争> <)

回答

1

我的团队只使用1.我也考虑过3,并且我们只有一个关于全局级代码的常规规则(和jshint约束)。我绝不会使用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

+0

Thanks @rob!我一定会检查他们的风格指南和最佳实践。 – dganoff

1

我总是这样说:

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

    <stuff> 

}]); 

是的,这是一个有点冗长,但它在全球范围内创造什么,这是很清楚什么控制器属于的模块,如果我需要将我的控制器分离到另一个文件中,我只需复制并过去它,而不必担心“应用程序”的定义位置或是否错过了“。”。在链式声明中。

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

总的来说,我相信你应该找到一个明确的标准并坚持下去。那样,如果某件事看起来不正确,你可以立即告诉。

相关问题