您將希望使用Object.defineProperty方法來監視對象的特定屬性以進行更改。我相信這是在大多數情況下Aurelia @bindable
和@observable
方法在幕後工作的方式。
Object.defineProperty(this.model, 'a', {
configurable: true,
enumerable: true,
get:() => {
return this.model.__a;
},
set: (v) => {
this.model.__a = v;
this.modelChanged(v);
}
});
值得一提的第一件事是setter方法set
你不能設置初始值內,否則將觸發一個遞歸循環,並拋出一個堆棧錯誤,讓你值分配給前綴雙下劃線名稱,類似於臨時隱藏變量。
然後我們班裏面定義我們的回調函數:
modelChanged(value) {
console.log(value);
}
最後,將其結合在一起,並使用setTimeout的測試:
export class MyViewModel {
model = {
a: '',
b: ''
};
constructor() {
Object.defineProperty(this.model, 'a', {
configurable: true,
enumerable: true,
get:() => {
return this.model.__a;
},
set: (v) => {
this.model.__a = v;
this.modelChanged(v);
}
});
setTimeout(() => {
this.model.a = 'HELLO!';
}, 3000);
}
modelChanged(value) {
console.log(value); // After 3 seconds, this should be "HELLO!" in the browser console.
}
}
說了這一切,值得注意的是bindingEngine.propertyObserver
功能本質上是在引擎蓋下做同樣的事情。我會誠實地考慮使用propertyObserver
,而不是在應用程序中引入一堆代碼行來觀看屬性。