2015-12-09 16 views
0

我有兩個控制器。我在父控制器中定義了一個$ rootScope變量,並根據點擊的下拉菜單進行更改。

我希望更改反映在子控制器中。

父控制器

$rootScope.variable = {'attr1':true, 'attr2':false, 'attr3':false}//initializing 
vm.clickedDropDown = function(index) { 
    $rootScope.variable = {'attr1':false, 'attr2':false, 'attr3':false } 
    switch (index) { 
     case 1: 
      $rootScope.variable={'attr1':true, 'attr2':false, 'attr3':false} 
      break; 
     case 2: 
      $rootScope.variable={'attr1':false, 'attr2':true, 'attr3':false} 
      break; 
     case 3: 
      $rootScope.variable={'attr1':false, 'attr2':false, 'attr3':true} 
      break; 
    } 
} 

兒童控制器

$rootScope.$watch($rootScope.variable,function(){ 
    console.log($rootScope.variable); 
    console.log("changed"); 
},true) 

變量發生變化,我能夠看到作爲輸出變量的變化。

+0

我會用從父'$ broadcast'到子控制器。這種方法並不昂貴,因爲廣播只發生一次。無論如何,它不是很好的習慣問候你的例子。 –

+0

'$ rootScope.watch('variable',...)''? – ccjmne

+0

由於變量未定義而拋出錯誤 –

回答

3

你的看法是錯誤的。

或者:

$rootScope.$watch('variable' ,function(){ 
    console.log($rootScope.variable); 
    console.log("changed"); 
},true); 

$rootScope.$watch(
    function() { 
     return $rootScope.variable; 
    }, 
    function(){ 
     console.log($rootScope.variable); 
     console.log("changed"); 
    },true); 
+0

選項2解決了。謝謝。將在幾分鐘內標記爲正確答案 –

+0

去選擇1 :) –

0

你可以簡單的使用範圍,因爲孩子控制器將繼承父控制器和訪問範圍定義的範圍變量和rootScope

HTML:

<div ng-controller="MyCtrl"> 
    <input type="text" ng-model="name"> 
    <div ng-controller="ChildCtrl"> 
    <pre>{{ debug }}</pre> 
    </div> 
</div> 

JS:

function MyCtrl($scope, $rootScope) { 
    $rootScope.name = 'Superhero'; 
} 

function ChildCtrl($scope, $rootScope) { 

    $rootScope.debug = ''; 

    $scope.$watch('name', function(newVal, oldVal) { 
     $scope.debug += " value changed..."; 
    }); 
} 

的jsfiddle:http://jsfiddle.net/heavyhorse/aqbhco7m/

+0

照顧原始類型和範圍的內在 – Jon