2014-04-22 93 views
1

我可能會使用這個錯誤,但我有一個函數,監視一個變量,當該變量從視圖中更改,該函數運行..但是當一個兄弟函數更改該變量手錶不運行。我編碼錯了嗎?Angular JS - 範圍觀察不更新

scope.$watch (settings.number, function(val){ 
    alert('test'); 
}) 
scope.exampleObj = { 
    exampleFunc : function(){ 
     settings.number += 5; 
    } 
}; 

所以當我調用scope.exampleObj.exampleFunc();不應該範圍觀看被叫?

+0

我覺得孩子們在變化不會觸發這種改變。你可以試着看數字本身,並更新數字而不是封閉在父對象中。不知道,但我有一箇舊版本的角度相同的問題 – Anoop

回答

2

替換字符串的函數或使用$ watchCollection,像這樣:

使用VAR:

angular.module('TestApp', []) 
    .controller('MainCtrl', function($scope){ 
     // Object 
     var settings = { 
      number: 1, 
      foobar: 'Hello World' 
     }; 

     $scope.$watch(function(){ return settings.number; }, function(newValue, oldValue){ 
      console.log('New value detected in settins.number'); 
     }); 

     $scope.$watchCollection(function(){ return settings; }, function(newValue, oldValue){ 
      console.log('New value detected in settings'); 
     }); 
    }); 

使用$範圍:

angular.module('TestApp', []) 
    .controller('MainCtrl', function($scope){ 
     // Object 
     $scope.settings = { 
      number: 1, 
      foobar: 'Hello World' 
     }; 

     $scope.$watch('settings.number', function(newValue, oldValue){ 
      console.log('New value detected in $scope.settings.number'); 
     }); 
    }); 

例子:http://jsfiddle.net/Chofoteddy/2SNFG/

* Note:AngularJS版本1.1.x及更高版本中提供的$ watchCollection。如果您需要觀察數組中的多個值或對象中的多個屬性,它會非常有用。

1

觀察者預期名稱(即字符串)屬性的範圍內,而不是對象本身。

scope.$watch ('settings.number', function(newval,oldval){ 
    alert('test'); 
}); 
    scope.exampleObj = { 
    exampleFunc : function(){ 
     scope.settings.number += 5; 
    } 
}; 

我假設某處聲明scope.settings.number第一,那你的意思是設置scope.settings.numbersettings.number,你只能看着它們的角scope的性能變量。

雖然你可能正在做正確的事情只是settings.number += 5;,我可能只是累了。

+0

工作示例http://jsfiddle.net/Ld7ub/ –

+0

@marck,爲什麼謝謝你先生的小提琴:)。我假設問題是沒有看到一個'$ scope'變量。 –

+0

@marck變量被聲明爲更高,原來問題不是這個部分..它的工作原理,除非我有一個時間間隔更新號碼。 – pashOCONNOR

0

您需要將objectEquality設置爲true。所以你可以使用angular.equals比較對象的相等性,而不是比較參考的相等性。

更多相關信息請訪問the documentation

scope.$watch (settings.number, function(val){ 
    alert('test'); 
},true) 
scope.exampleObj = { 
    exampleFunc : function(){ 
     settings.number += 5; 
    } 
};