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

首頁 > 編程 > JavaScript > 正文

淺談angular.js中實(shí)現(xiàn)雙向綁定的方法$watch $digest $apply

2019-11-20 11:28:10
字體:
供稿:網(wǎng)友

Angular.js 中的特性,雙向綁定.

多么神奇的功能,讓視圖的改變直接反應(yīng)到數(shù)據(jù)中,數(shù)據(jù)的改變又實(shí)時(shí)的通知到視圖,如何做到的?

這要?dú)w功于 scope 下面3個(gè)重要的方法:

$watch
$digest
$apply

他們的區(qū)別是什么,我們來介紹下:

$watch
這是一個(gè)監(jiān)聽 scope 上數(shù)據(jù)的監(jiān)聽器

方法說明:

$scope.$watch('參數(shù)',function(newValue,oldValue){ //邏輯處理})

上面我們就是創(chuàng)建了一個(gè)監(jiān)聽器.
‘參數(shù)' 就是$scope對象下的一個(gè)對象(或者一個(gè)對象的屬性),注意,這里是字符串形式.

假如你要監(jiān)聽 $scope.name 屬性.

$scope.$watch('name',function(newValue,oldValue){ //邏輯處理})

如上代碼, ‘name' 需要引號

參數(shù)后面跟著回調(diào)函數(shù),回調(diào)函數(shù)參數(shù)返回了被監(jiān)聽 屬性,變化后的新值,以前變化前的舊值.

$digest

他負(fù)責(zé)檢查 scope 中的數(shù)據(jù)是否發(fā)生了變化,如果某個(gè)屬性有變化,馬上會通知此屬性的監(jiān)聽器 ($watch 注冊的監(jiān)聽器),觸發(fā)監(jiān)聽器,執(zhí)行回調(diào)函數(shù).

$apply

這個(gè)方法和 $digest 很相似, $digest 檢查scope 中的所有數(shù)據(jù)
$apply 相當(dāng)于檢查 rootScope 中的所有數(shù)據(jù),他會從父級到子級來檢查所有數(shù)據(jù)

$apply() == $rootScope.$digest()

$apply() 方法有兩種形式.

第一種 接受一個(gè) function作為參數(shù).
這樣觸發(fā) $digest 函數(shù)并且執(zhí)行一次 參數(shù)中的 function

第二種  不接受任何參數(shù).
這樣只是觸發(fā)一輪 $digest 父級到子級的循環(huán)

Angular.js 中一班不會直接調(diào)用 $digest ,而是用 $scope.$apply() 來代替

我沒有設(shè)定監(jiān)視器,為什么視圖和數(shù)據(jù)可以雙向綁定

比如一個(gè)文本框 ng-model="name"
這時(shí)其實(shí) $scope 對象下已經(jīng)有了一個(gè)屬性 name 來對應(yīng)和 上面的視圖進(jìn)行雙向綁定

如何實(shí)現(xiàn)的?

其實(shí),當(dāng)我們定義 ng-model="name"  或者 ng-bind="name" 或者 {{name}}
這時(shí) angular.js 會在 $scope 模型上自動(dòng)為 “name” 屬性設(shè)置一個(gè)監(jiān)聽器:

$scope.$watch('name', function(newValue, oldValue) {  //監(jiān)聽 name 屬性的變化});

原來這里 angular.js 幫我們自動(dòng)創(chuàng)建了一個(gè)監(jiān)聽器,所以此屬性和 $scope.name 數(shù)據(jù)才會實(shí)時(shí)的雙向綁定.

當(dāng)然,有時(shí)候你也會發(fā)現(xiàn)明明數(shù)據(jù)變化了.但是UI 沒有刷新,是雙向綁定失效了嗎?

沒有

只是在 $scope 模型遍歷 digest 循環(huán)時(shí),你的數(shù)據(jù)還沒有返回來,

比如異步調(diào)用方法,callbac 返回的數(shù)據(jù)
比如你在 setTimeout 設(shè)置了定時(shí)觸發(fā)函數(shù),然后修改模型數(shù)據(jù)
總之,是錯(cuò)過了 $scope 模型的 digest 循環(huán),導(dǎo)致模型沒有通知UI去根據(jù)新數(shù)據(jù)刷新.

遇到這樣的問題怎么辦?

我們只好自己去手動(dòng)調(diào)用 digest來循環(huán)檢查一次數(shù)據(jù).實(shí)現(xiàn)雙向綁定

上面我們已經(jīng)說過,通常不要去直接調(diào)用 digest 方法,而是手動(dòng)調(diào)用 $apply 方法,間接實(shí)現(xiàn)觸發(fā) $digest 循環(huán).

如下:

setTimeout(function() { $scope.name= '一介布衣'; $scope.$apply();}, 2000);

問題來了,上面時(shí)候該去手動(dòng)調(diào)用 apply 方法

目前為止, angular.js 為一部分指令和服務(wù)自動(dòng)實(shí)現(xiàn)了 $apply() 方法.

例如, ng-click ,ng-model ,$timeout服務(wù),$http服務(wù) 等

調(diào)用后,angular.js 會自動(dòng)幫我們調(diào)用 $apply() 來實(shí)現(xiàn)數(shù)據(jù)雙向綁定.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 磴口县| 睢宁县| 龙井市| 长阳| 绥滨县| 台北县| 天台县| 马尔康县| 文登市| 麟游县| 顺义区| 育儿| 南华县| 昭觉县| 碌曲县| 桂平市| 手游| 芦溪县| 林芝县| 成安县| 建德市| 黄石市| 砚山县| 宕昌县| 富宁县| 丰都县| 饶平县| 兴国县| 彩票| 北碚区| 杨浦区| 达拉特旗| 江陵县| 金华市| 文水县| 天等县| 金堂县| 唐海县| 苏尼特左旗| 海晏县| 梧州市|