2015-02-05 39 views
0

我被亞當·弗里曼讀書臨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

回答

3

你會在互聯網上看到很多像書籍&這樣的例子。關鍵是$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
  1. 這個數據只屬於那個控制器,而不是 這個應用程序的其他地方嗎?
  2. 這些數據是否直接支持視圖模型的生成(而不是業務邏輯)?
  3. 這是否創建了一個「胖」控制器(即使代碼難以遵循)?

(我不知道該列表是綜合)

如果答案是「不」,那麼它可能確定它保留下來。

並非所有東西都在$範圍內。我有時候看到這個問題:

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

$scope.init(); 

顯然,沒有理由附加init到的範圍,並會在控制器中定義了一個名爲功能可以更好地宣稱:

function init(){ 
} 

init(); 
相關問題