首頁  >  文章  >  web前端  >  angularJS的$watch失效問題的解決詳解

angularJS的$watch失效問題的解決詳解

黄舟
黄舟原創
2017-08-13 10:52:221618瀏覽

本篇文章主要介紹了淺談angularJS的$watch失效問題的解決方案,具有一定的參考價值,有興趣的小伙伴們可以參考一下。

本文介紹了淺談angularJS的$watch失效問題的解決方案,分享給大家,順便給自己留個筆記

$watch方法,它可以幫助我們在每個scope中監視其中的變數。

$watch 單一的變數

對於普通的變數時,如數字,字串等,直接如下寫是可以監視到變數的變化,並執行對應的函數的。


$scope.count=1;
$scope.$watch('count',function(){
...
});

$watch 多個變數

對於多個變數的監視變化,執行相同函數的話,可以將這幾個變數轉為字串,以'+'號隔開來進行監視


//当count或page变化时,都会执行这个匿名函数
$scope.count=1;
$scope.page=1;
$scope.$watch('count + page',function(){
...
});

$watch物件或陣列

#發現用上面兩種方法監視陣列時,會發現即使陣列的內容改變了,也沒有觸發到這個匿名函數。之後發現watch函數其實是有三個變數的,第一個參數是需要監視的對象,第二個參數是在監視對象改變時需要呼叫的函數,實際上watch還有第三個參數,它在默認情況下是false。

當第三個參數是false時,其實watch函數監視的是陣列的位址,而陣列的內容的變化不會影響陣列位址的變化,所以watch函數失靈了。

解決辦法,就是在後面加上第三個參數為true就好(當然,也可以將此監聽回傳結果為JSON字串形式的該物件或陣列的的匿名函數。)


$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch('items',function(){...},true);

或將監聽傳回結果為JSON字串形式的該物件或陣列的匿名函數


$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch(function(){
  return JSON.stringify($scope.items);
},function(){...});

$watch 函數的回傳結果

在寫程式碼的時候,有時會遇到要監視一個函數回傳的結果是否變化的情況,所以查了一下$watch 監視函數的情況。

方法1:監視物件為「函數名稱()」的字串,記得加上「()」!


//未完成的任务个数
$scope.unDoneCount = function() {
  var count = 0;
  angular.forEach($scope.todoList, function(todo) {
    count += todo.done ? 0 : 1;
  });
  return count;
};
//单选影响全选部分
$scope.$watch('unDoneCount()', function(nv) {
  $scope.isDoneAll = nv ? false : true;
});

方法2:在監視物件中設定為匿名函數,傳回要監視的函數的回傳值(繞暈了…)


#
$scope.$watch(function(){
  return $scope.unDoneCount();//不要忘了(),要执行的啊~
}, function(nv) {
  $scope.isDoneAll = nv ? false : true;
});

取消$watch

watch的效能消耗好像蠻大的,所以對於已經不需要監視的watch,記得定時取消掉。

至於怎麼取消了…查了好久才找到的

其實每個watch函數回傳的結果就是這個watch的deregisterWatch()函數


//在chrome的控制台上,断点得到的$watch的返回值
function deregisterWatch() {
  arrayRemove(array, watcher);
  lastDirtyWatch = null;
}

所以啊,要取消watch的話,一開始將$watch的回傳值保存就好啦,要取消watch的時候,在呼叫。


var count=1;
var unbingWatch=$scope.$watch('todoList',function(){
  console.log('todoList change');
  count++;
  //相当于在todoList变化了4次之后,就调用unbingWatch()取消这个watch
  //在第5次todoList改变的时候,就不会输出todoList change了。
  if(count>4){
    unbingWatch();
  }
});

以上是angularJS的$watch失效問題的解決詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn