国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

淺談angularJS的$watch失效問(wèn)題的解決方案

2019-11-19 15:49:47
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文介紹了淺談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)隔開來(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)容改變了,也沒有觸發(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)聽返回結(jié)果為JSON字符串形式的該對(duì)象或數(shù)組的的匿名函數(shù)。)

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

或者將監(jiān)聽返回結(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的話,一開始將$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í)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 拜泉县| 娱乐| 丰宁| 屏边| 大姚县| 怀柔区| 双鸭山市| 兴海县| 府谷县| 福安市| 新野县| 白沙| 双江| 秀山| 新竹市| 繁昌县| 固镇县| 涿鹿县| 宝鸡市| 鲁甸县| 三穗县| 上蔡县| 来安县| 民丰县| 宁化县| 五家渠市| 犍为县| 新竹市| 临安市| 怀化市| 凤山市| 金山区| 阿坝县| 米脂县| 连城县| 闵行区| 淅川县| 平定县| 大港区| 德化县| 灵山县|