中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

angularJS的$watch失效怎么辦

發布時間:2021-07-12 14:51:30 來源:億速云 閱讀:191 作者:小新 欄目:web開發

小編給大家分享一下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失效怎么辦”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

成武县| 柘荣县| 社会| 靖州| 进贤县| 安国市| 禄劝| 虎林市| 鄂托克旗| 横山县| 德惠市| 武威市| 湖南省| 库车县| 洮南市| 江川县| 西丰县| 东安县| 昭觉县| 会宁县| 沿河| 景东| 陕西省| 肃南| 濉溪县| 龙川县| 福泉市| 那坡县| 新乡市| 湛江市| 嘉善县| 阿勒泰市| 台东市| 桂东县| 嘉定区| 隆尧县| 渭源县| 青阳县| 深水埗区| 义马市| 泾源县|