2014-06-10 41 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