应该避免在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模式,如指令或服务?

+1

我想他们有没有理由公开dayNames,所以他们没有绑定到$ scope? – 2015-02-05 18:39:50

你会在互联网上看到很多像书籍&这样的例子。关键是$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项目中有利的分离。

+0

并挑剔,它应该正确命名为'tomorrowService' - 工厂只是生成该服务实例的功能:) – 2015-02-05 18:54:41

+0

我输入得太快。你赢了:)修正@NewDev – 2015-02-05 18:55:10

  1. 这个数据只属于那个控制器,而不是 这个应用程序的其他地方吗?
  2. 这些数据是否直接支持视图模型的生成(而不是业务逻辑)?
  3. 这是否创建了一个“胖”控制器(即使代码难以遵循)?

(我不知道该列表是综合)

如果答案是“不”,那么它可能确定它保留下来。

并非所有东西都在$范围内。我有时候看到这个问题:

$scope.init = function(){ 
    // do some initialization 
} 

$scope.init(); 

显然,没有理由附加init到的范围,并会在控制器中定义了一个名为功能可以更好地宣称:

function init(){ 
} 

init();