데이터 양 방향 바 인 딩 Angular 더러 운 새로 고침 실현 (3)
더러 운 리 셋 은 기본적으로 구독 자 디자인 모드 를 따 릅 니 다. $watch 는 감청 자 를 $$watchers 에 추가 합 니 다. $degist 를 실행 할 때 watchers 목록 을 읽 습 니 다. 수치 가 변 경 된 것 을 발견 하면 페이지 를 리 셋 합 니 다. getter / setter 와 가장 큰 차이 점 은 두 가지 가 있 습 니 다. 1. 수치 가 변 경 될 때 $degist 를 주동 적 으로 실행 하여 주동 적 으로 리 셋 해 야 합 니 다.2. $degist 는 감청 목록 을 스 캔 합 니 다. 감청 목록 이 너무 길 면 성능 문제 가 발생 하기 쉽 습 니 다.
코드 구현
1. $watch 함 수 를 정의 하고 감청 할 속성 을 기록 하 며 이 속성 을 $watcher 감청 목록 에 넣 습 니 다.
$watch: function (key, listenerFn) {
var self = this;
var watchFn = function (scope) {
return {value: scope.model[key], key: key};
}
var watcher = {
watchFn: watchFn,
listenerFn: listenerFn || function () {}
};
this.$$watcher.push(watcher);
}
2. $digest 능 동적 데이터 새로 고침, 함수 가 감청 목록 의 요 소 를 읽 고 신 구 수 치 를 비교 합 니 다. 데이터 가 다른 것 을 발견 하면 다시 렌 더 링 합 니 다.
$digest: function () {
var self = this;
var length = this.$$watcher.length;
var watcher, newValue, oldvalue, key;
while(length--){
watcher = this.$$watcher[length];
console.log(watcher)
newValue = watcher.watchFn(this).value;
key = watcher.watchFn(this).key;
oldValue = watcher.last;
if(newValue !== oldValue){
watcher.last = newValue;
var arr = self.model2sync[key]
each(arr, function() {
// text
this.node.textContent = self.renderStr(this.raw)
})
// var arr = self.model2sync[key]
// console.log(arr)
watcher.listenerFn(newValue, oldValue, this, key);
}
}
}
3. model 데 이 터 를 바 꾸 고 $digest 함 수 를 주동 적 으로 실행 하여 더러 운 값 검 사 를 합 니 다.
var demo1 = mvvm('#demo1', {
model: {
name: 'world',
time: Date(),
css: 'green'
}
});
demo1.$watch('time')
setInterval(function () {
demo1.model.time = Date();
demo1.$digest();
}, 1000);
4. 전체 코드http://codepen.io/youyudehexie/pen/NxbqPz
Getter / setter 의 우열 을 비교 하 다
장점 은 먼저 중요 한 예 를 들 어 목록 페이지 를 새로 고침 합 니 다.
// ,renderData 。
var renderData = [0...1000];
renderData[] = 0; // 0.
for (var i = 0; i < 1000; i++) {
renderData[i] = 1;
}
우리 가 Getter / setter 를 사용 할 때 실제 적 으로 수 치 를 수정 할 때마다 리 셋 모델 링 방법 을 활성화 시 키 고 더러 운 리 셋 은 1000 개 요소 의 수치 변동 을 완성 한 후에 Dom 으로 통일 적 으로 리 셋 할 수 있다. 한 번 만 리 셋 하면 분명히 더러 운 리 셋 의 장점 이 크다.
결점.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.