应该避免在AngularJS控制器中包含常规的Javascript对象吗?
我被亚当·弗里曼读书临AngularJS,和我有一个关于书的一个例子一个吹毛求疵的问题:应该避免在AngularJS控制器中包含常规的Javascript对象吗?
myApp.controller("tomorrowCtrl", function($scope) {
var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";]
$scope.day = dayNames[(new Date().getDay() + 1) % 7];
});
我明白这是什么控制器的总体目标是:以显示的一天的名字通过$scope.day
观看周。但我很困惑,为什么控制器使用普通的Javascript数组 - var dayNames
- 创建$scope
对象。
的AngularJS controller documentation解释控制器用于:
建立$范围对象的初始状态[并]添加行为到$范围对象。
当然,dayNames
有助于设置$ scope对象的初始状态。它还包含了一些应用程序的业务逻辑,所以我想它有点检查。我担心的是,我还没有发现任何遵循此设计模式的其他AngularJS控制器示例;我还没有在Angular controller文档中找到任何东西,也没有找到PhoneCat教程。
在这样的AngularJS控制器中包含普通的Javascript对象是否有意义? (这是否认为是无害的?)
如果不是,为什么? 不是有没有很好的理由在控制器中包含普通的Javascript对象?另外,是否有不同的方式可以使dayNames
适合Angular模式,如指令或服务?
你会在互联网上看到很多像书籍&这样的例子。关键是$scope.day
设置为东西,我相信它是如何反映它在你的view
。
您可以外接普通的JavaScript逻辑和内angularJS使用它,它显然不会休息任何东西,但通常这是很好的做法,在服务/工厂控制器之外所做的一切范围操作/业务逻辑/供应商。为什么要反对angularJS并使用外部事物?你想坚持angularJS的流程。
比方说,这是做事情要复杂得多它会的,可能看起来更像是这样的:
myApp.factory("tomorrowService", function() {
// factory's can be written in many different patterns
// this is just for examples sake
return {
getDays : function() { /* return stuff */ }
}
});
myApp.controller("tomorrowCtrl", function($scope, tomorrowService) {
$scope.day = tomorrowService.getDays();
});
采用的方法中tomorrowService
做所有的业务逻辑,并返回某种结果。
我发现这篇文章(http://toddmotto.com/rethinking-angular-js-controllers/)非常有助于更好地了解如何使您的控制器和在angularJS项目中有利的分离。
并挑剔,它应该正确命名为'tomorrowService' - 工厂只是生成该服务实例的功能:) – 2015-02-05 18:54:41
我输入得太快。你赢了:)修正@NewDev – 2015-02-05 18:55:10
- 这个数据只属于那个控制器,而不是 这个应用程序的其他地方吗?
- 这些数据是否直接支持视图模型的生成(而不是业务逻辑)?
- 这是否创建了一个“胖”控制器(即使代码难以遵循)?
(我不知道该列表是综合)
如果答案是“不”,那么它可能确定它保留下来。
并非所有东西都在$范围内。我有时候看到这个问题:
$scope.init = function(){
// do some initialization
}
$scope.init();
显然,没有理由附加init
到的范围,并会在控制器中定义了一个名为功能可以更好地宣称:
function init(){
}
init();
我想他们有没有理由公开dayNames,所以他们没有绑定到$ scope? – 2015-02-05 18:39:50