2014-06-10 70 views
0

我的頁面的一部分由控制器處理。它取決於全局屬性$ scope.selected。我必須在控制器啓動時以及$ scope.selected的值發生更改時初始化控制器。

.controller ('Details', ['$scope', function ($scope) { 
    function init() { 
    $scope.viewProperty = complexOperation($scope.selected); 
    } 
    $scope.$watch ('selected', init); 
    init(); 
}]) 

<span ng-if="selected.gto" ng-controller="Details"> 
    {{viewProperty}} 
</span> 

我在控制器初始化和$ scope.selected的變化上調用init。 這對我來說不太好,有沒有更好的解決方案?

+1

'init()'將在控制器初始化時被手錶調用。你可以在init()裏面用'console.log'來檢查。因此,控制器中的最後一個'init()'語句是多餘的。 –

+0

不,那不是真的,如果我省略對init()的調用,我的業力測試就會失敗。 – user3725805

+0

也許你應該檢查測試...確保它調用'$ apply'或'$ digest'。 –

回答

0

$watch()通常用於指令而不是控制器。也像評論中提到的init()在控制器初始化時被調用一次,因爲$watch在初始化時調用其偵聽器一次。這裏有一篇關於這個練習的文章Angular JS - you probably shouldn't use $watch in your controllers.

+0

優秀的點和鏈接。我唯一需要補充的是,應該從DOM中使用ng-change來指示控制器內部的變化(即使在這個問題中沒有提及DOM參考) – Brocco

+0

我同意Lenny在鏈接文章中的評論。我正在使用$ watch來將控制器彼此分離。全局控制器設置一個屬性,不必調用內部控制器的功能。 – user3725805

+0

我正在尋找的東西就像 user3725805