淺談angularJS的$watch失效問(wèn)題的解決方案
本文介紹了淺談angularJS的$watch失效問(wèn)題的解決方案,分享給大家,順便給自己留個(gè)筆記
$watch方法,它可以幫助我們?cè)诿總€(gè)scope中監(jiān)視其中的變量。
$watch 單一的變量
對(duì)于普通的變量時(shí),如數(shù)字,字符串等,直接如下寫是可以監(jiān)視到變量的變化,并執(zhí)行相應(yīng)的函數(shù)的。
$scope.count=1; $scope.$watch('count',function(){ ... });
$watch 多個(gè)變量
對(duì)于多個(gè)變量的監(jiān)視變化,執(zhí)行同一函數(shù)的話,可以將這幾個(gè)變量轉(zhuǎn)為字符串,以‘+'號(hào)隔開(kāi)來(lái)進(jìn)行監(jiān)視
//當(dāng)count或page變化時(shí),都會(huì)執(zhí)行這個(gè)匿名函數(shù) $scope.count=1; $scope.page=1; $scope.$watch('count + page',function(){ ... });
$watch對(duì)象或數(shù)組
發(fā)現(xiàn)用上面兩種方法去監(jiān)視數(shù)組時(shí),會(huì)發(fā)現(xiàn)即使數(shù)組的內(nèi)容改變了,也沒(méi)有觸發(fā)到這個(gè)匿名函數(shù)。之后發(fā)現(xiàn)watch函數(shù)其實(shí)是有三個(gè)變量的,第一個(gè)參數(shù)是需要監(jiān)視的對(duì)象,第二個(gè)參數(shù)是在監(jiān)視對(duì)象發(fā)生變化時(shí)需要調(diào)用的函數(shù),實(shí)際上watch還有第三個(gè)參數(shù),它在默認(rèn)情況下是false。
當(dāng)?shù)谌齻€(gè)參數(shù)是false時(shí),其實(shí)watch函數(shù)監(jiān)視的是數(shù)組的地址,而數(shù)組的內(nèi)容的變化不會(huì)影響數(shù)組地址的變化,所以watch函數(shù)失靈了。
解決辦法,就是在后面添加第三個(gè)參數(shù)為true就好(當(dāng)然,也可以將這監(jiān)聽(tīng)返回結(jié)果為JSON字符串形式的該對(duì)象或數(shù)組的的匿名函數(shù)。)
$scope.items=[ {a:1}, {a:2} {a:3}]; $scope.$watch('items',function(){...},true);
或者將監(jiān)聽(tīng)返回結(jié)果為JSON字符串形式的該對(duì)象或數(shù)組的的匿名函數(shù)
$scope.items=[ {a:1}, {a:2} {a:3}]; $scope.$watch(function(){ return JSON.stringify($scope.items); },function(){...});
$watch 函數(shù)的返回結(jié)果
在寫代碼的時(shí)候,有時(shí)會(huì)遇到要監(jiān)視一個(gè)函數(shù)返回的結(jié)果是否變化的情況,所以查了一下$watch 監(jiān)視函數(shù)的情況。
方法1:監(jiān)視對(duì)象為“函數(shù)名()”的字符串,記得加“()”!
//未完成的任務(wù)個(gè)數(shù) $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:在監(jiān)視對(duì)象中設(shè)置為匿名函數(shù),返回要監(jiān)視的函數(shù)的返回值(繞暈了…)
$scope.$watch(function(){ return $scope.unDoneCount();//不要忘了(),要執(zhí)行的啊~ }, function(nv) { $scope.isDoneAll = nv ? false : true; });
取消$watch
watch的性能消耗好像蠻大的,所以對(duì)于已經(jīng)不需要監(jiān)視的watch,記得定時(shí)取消掉。
至于怎么取消了…查了好久才找到的
其實(shí)每個(gè)watch函數(shù)返回的結(jié)果就是這個(gè)watch的deregisterWatch()函數(shù)
//在chrome的控制臺(tái)上,斷點(diǎn)得到的$watch的返回值 function deregisterWatch() { arrayRemove(array, watcher); lastDirtyWatch = null; }
所以啊,要取消watch的話,一開(kāi)始將$watch的返回值保存就好啦,要取消watch的時(shí)候,在調(diào)用。
var count=1; var unbingWatch=$scope.$watch('todoList',function(){ console.log('todoList change'); count++; //相當(dāng)于在todoList變化了4次之后,就調(diào)用unbingWatch()取消這個(gè)watch //在第5次todoList改變的時(shí)候,就不會(huì)輸出todoList change了。 if(count>4){ unbingWatch(); } });
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- angular $watch 一個(gè)變量的變化(實(shí)例講解)
- Angular中的$watch、$watchGroup、$watchCollection
- Angular中使用$watch監(jiān)聽(tīng)object屬性值的變化(詳解)
- 關(guān)于angular js_$watch監(jiān)控屬性和對(duì)象詳解
- 淺談Angular.js中使用$watch監(jiān)聽(tīng)模型變化
- AngularJS中$apply方法和$watch方法用法總結(jié)
- AngularJS中watch監(jiān)聽(tīng)用法分析
- AngularJS中的$watch(),$digest()和$apply()區(qū)分
相關(guān)文章
AngularJS對(duì)動(dòng)態(tài)增加的DOM實(shí)現(xiàn)ng-keyup事件示例
這篇文章主要介紹了AngularJS對(duì)動(dòng)態(tài)增加的DOM實(shí)現(xiàn)ng-keyup事件示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03詳解如何構(gòu)建一個(gè)Angular6的第三方npm包
這篇文章主要介紹了詳解如何構(gòu)建一個(gè)Angular6的第三方npm包,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Angular ng-animate和ng-cookies用法詳解
本文講一下Angular中動(dòng)畫應(yīng)用的部分。這篇文章主要介紹了Angular ng-animate和ng-cookies用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Angular4學(xué)習(xí)筆記之根模塊與Ng模塊
這篇文章主要介紹了Angular4學(xué)習(xí)筆記之根模塊與Ng模塊,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Angularjs的Controller間通信機(jī)制實(shí)例分析
這篇文章主要介紹了Angularjs的Controller間通信機(jī)制,結(jié)合實(shí)例形式分析了Controller通信機(jī)制的原理、實(shí)現(xiàn)技巧與相關(guān)操作技巧,需要的朋友可以參考下2016-11-11Angular8升級(jí)至Angular13遇到的問(wèn)題解決
這幾天升級(jí)公司的一個(gè)Angular項(xiàng)目遇到了一些問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Angular8升級(jí)至Angular13遇到的問(wèn)題解決,文中介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法
今天小編就為大家分享一篇AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Angular實(shí)現(xiàn)表單驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了Angular實(shí)現(xiàn)表單驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Angular2管道Pipe及自定義管道格式數(shù)據(jù)用法實(shí)例分析
這篇文章主要介紹了Angular2管道Pipe及自定義管道格式數(shù)據(jù)用法,結(jié)合實(shí)例形式詳細(xì)分析了Angular2管道與純管道相關(guān)概念、語(yǔ)法及使用技巧,需要的朋友可以參考下2017-11-11