淺談angularJS的$watch失效問題的解決方案
本文介紹了淺談angularJS的$watch失效問題的解決方案,分享給大家,順便給自己留個(gè)筆記
$watch方法,它可以幫助我們在每個(gè)scope中監(jiān)視其中的變量。
$watch 單一的變量
對于普通的變量時(shí),如數(shù)字,字符串等,直接如下寫是可以監(jiān)視到變量的變化,并執(zhí)行相應(yīng)的函數(shù)的。
$scope.count=1;
$scope.$watch('count',function(){
...
});
$watch 多個(gè)變量
對于多個(gè)變量的監(jiān)視變化,執(zhí)行同一函數(shù)的話,可以將這幾個(gè)變量轉(zhuǎn)為字符串,以‘+'號隔開來進(jìn)行監(jiān)視
//當(dāng)count或page變化時(shí),都會執(zhí)行這個(gè)匿名函數(shù)
$scope.count=1;
$scope.page=1;
$scope.$watch('count + page',function(){
...
});
$watch對象或數(shù)組
發(fā)現(xiàn)用上面兩種方法去監(jiān)視數(shù)組時(shí),會發(fā)現(xiàn)即使數(shù)組的內(nèi)容改變了,也沒有觸發(fā)到這個(gè)匿名函數(shù)。之后發(fā)現(xiàn)watch函數(shù)其實(shí)是有三個(gè)變量的,第一個(gè)參數(shù)是需要監(jiān)視的對象,第二個(gè)參數(shù)是在監(jiān)視對象發(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)容的變化不會影響數(shù)組地址的變化,所以watch函數(shù)失靈了。
解決辦法,就是在后面添加第三個(gè)參數(shù)為true就好(當(dāng)然,也可以將這監(jiān)聽返回結(jié)果為JSON字符串形式的該對象或數(shù)組的的匿名函數(shù)。)
$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch('items',function(){...},true);
或者將監(jiān)聽返回結(jié)果為JSON字符串形式的該對象或數(shù)組的的匿名函數(shù)
$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch(function(){
return JSON.stringify($scope.items);
},function(){...});
$watch 函數(shù)的返回結(jié)果
在寫代碼的時(shí)候,有時(shí)會遇到要監(jiān)視一個(gè)函數(shù)返回的結(jié)果是否變化的情況,所以查了一下$watch 監(jiān)視函數(shù)的情況。
方法1:監(jiān)視對象為“函數(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)視對象中設(shè)置為匿名函數(shù),返回要監(jiān)視的函數(shù)的返回值(繞暈了…)
$scope.$watch(function(){
return $scope.unDoneCount();//不要忘了(),要執(zhí)行的啊~
}, function(nv) {
$scope.isDoneAll = nv ? false : true;
});
取消$watch
watch的性能消耗好像蠻大的,所以對于已經(jīng)不需要監(jiān)視的watch,記得定時(shí)取消掉。
至于怎么取消了…查了好久才找到的
其實(shí)每個(gè)watch函數(shù)返回的結(jié)果就是這個(gè)watch的deregisterWatch()函數(shù)
//在chrome的控制臺上,斷點(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í)候,就不會輸出todoList change了。
if(count>4){
unbingWatch();
}
});
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- angular $watch 一個(gè)變量的變化(實(shí)例講解)
- Angular中的$watch、$watchGroup、$watchCollection
- Angular中使用$watch監(jiān)聽object屬性值的變化(詳解)
- 關(guān)于angular js_$watch監(jiān)控屬性和對象詳解
- 淺談Angular.js中使用$watch監(jiān)聽模型變化
- AngularJS中$apply方法和$watch方法用法總結(jié)
- AngularJS中watch監(jiān)聽用法分析
- AngularJS中的$watch(),$digest()和$apply()區(qū)分
相關(guān)文章
淺談angular4 ng-content 中隱藏的內(nèi)容
本篇文章主要介紹了淺談angular4 ng-content 中隱藏的內(nèi)容,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
Agularjs妙用雙向數(shù)據(jù)綁定實(shí)現(xiàn)手風(fēng)琴效果
最近在工作總遇到需要實(shí)現(xiàn)類似手風(fēng)琴效果的需求,下面小編通過本文給大家分享angularjs巧用雙向數(shù)據(jù)綁定實(shí)現(xiàn)手風(fēng)琴效果,需要的朋友可以參考下2017-05-05
Angular.js中ng-if、ng-show和ng-hide的區(qū)別介紹
angularJS中的ng-show、ng-hide、ng-if指令都可以用來控制dom元素的顯示或隱藏。那么這篇文章就給大家主要介紹了Angular.js中ng-if、ng-show和ng-hide的區(qū)別,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
使用Angular 6創(chuàng)建各種動畫效果的方法
Angular能夠讓我們創(chuàng)建出具有原生表現(xiàn)效果的動畫。我們將通過本文學(xué)習(xí)到如何使用Angular 6來創(chuàng)建各種動畫效果。在此,我們將使用Visual Studio Code來進(jìn)行示例演示。感興趣的朋友跟隨小編一起看看吧2018-10-10
angularJS與bootstrap結(jié)合實(shí)現(xiàn)動態(tài)加載彈出提示內(nèi)容
這篇文章主要介紹了angularJS與bootstrap結(jié)合實(shí)現(xiàn)動態(tài)加載彈出提示內(nèi)容,通過bootstrp彈出提示。感興趣的朋友可以參考下本篇文章2015-10-10
Angular+Ionic使用queryParams實(shí)現(xiàn)跳轉(zhuǎn)頁傳值的方法
這篇文章主要介紹了Angular+Ionic使用queryParams實(shí)現(xiàn)跳轉(zhuǎn)頁傳值的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Angular中Lazy Loading懶加載陷阱避坑最佳實(shí)踐
這篇文章主要為大家介紹了Angular中Lazy Loading懶加載陷阱避坑最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
AngularJS 將再發(fā)布一個(gè)重要版本 然后進(jìn)入長期支持階段
目前團(tuán)隊(duì)正在開發(fā) AngularJS 1.7.0,而 1.7 的開發(fā)周期將一直持續(xù)到 2018 年 6 月 30 日2018-01-01

