angular.js的雙向綁定就是可以將界面操作可以反映到數據,數據改變也可以體現在界面上。
界面到數據的傳遞,主要有UI事件,timeout超時器和ajax請求等回調操作。而數據到界面的傳遞則需要臟數據。只有前面界面到數據的操作發生的時候才會有臟數據檢查。每次 UI 事件變更,ajax 還有 timeout 都會觸發 $apply(),后者才會去調用$digest。
一.$watch對象
watch ={
name:name // 監聽到的對象
getNewValue: function($scope){
}//獲取到的新數據
listener:function(newValue,oldValue){
} //將新數據和舊數據進行比較,進行操作。
}
getNewValue() 可以得到當前$scope 上的最新值,listener 函數得到新值和舊值并進行一些操作。
1.創建$scope監聽
function $scope(){
this.$$watchList= [];
}
$scope.propertype.$watch =? function(name,getNewValue,listener){
var? watch? ={
name:name,
getNewValue:getNewValue,
listener:listener || function(){}
}
this.$$watchList.push(watch);
}
$scope.prototype.$$digestOnce =function(){
var dirty;
var? list? =? this.$$watchList;
for(var i = 0; i < list.length; i++){
var newValue? =? list[i].getNewValue(this.value);
var oldValue? = list[i].last;
if(newValue !== oldValue){
list[i].listener(newValue,oldValue);
dirty =true;
}
list[i].last? = newValue;
return dirty;
}
}
$scope.prototype.$digest =function(){
var dirty=true;
var time=0;
if(dirty){
dirty? =? this.$$digestOnce();
time++;
if(time > 10 && dirty){
throw new error();
}
}
}