Aurelia 自定义绑定行为以观察对象的所有属性
Aurelia custom Binding Behavior to observe ALL properties of an object
我想创建一个自定义绑定行为,允许我检测对象属性的任何更改,如下所示:
<my-form model.bind="myObject & objectObserver:myObjChanged()"></my-form>
我知道我可以使用 Aurelia 的绑定引擎创建一个 属性 观察者,也许我可以将其构建到自定义绑定行为中以检测对象的属性并创建 属性 观察者为每一个。但是我无法理解在自定义绑定行为中提供给我的绑定对象。到目前为止,这是我的代码:
import { inject, bindingBehavior, BindingEngine } from 'aurelia-framework';
@bindingBehavior('objectObserver')
@inject(BindingEngine)
export default class ObjectObserverBindingBehavior {
constructor(bindingEngine) {
this.bindingEngine = bindingEngine;
}
bind(binding, scope, interceptor) {
console.warn('hello', binding, scope, interceptor);
}
unbind(binding, scope) {
console.warn('observer.unbind()', binding, scope);
}
}
当绑定发生并输出控制台文本时,我明白了
所以我知道它有效,但我不知道开始观看的最佳对象是什么。我在 targetObserver.currentValue 中看到了绑定对象。这是开始观看的最佳 属性 吗?有没有其他方法可以利用 Aurelia 绑定引擎的现有功能?
我找到了一个不是特定于 Aurelia 的解决方案,它基于 Javascript 中内置的 Proxy 功能。
export function onChangeObj(object, onChange) {
// creates Proxy to detect changes in object properties and call a function
if (typeof onChange !== 'function' || typeof object !== 'object') {
throw new Error('onChangeObj: incorrect parameters');
}
const handler = {
set(obj, prop, value) {
onChange(prop, value);
return Reflect.set(obj, prop, value);
},
};
return new Proxy(object, handler);
}
为了使用它,就这样调用它:
this.myObject = onChangeObj(this.myObject, () => this.myObjChanged());
实际上,对象被包装代理替换,每次修改其中一个属性时调用提供的函数(使用 setter)。
如果有人通过 Aurelia Binding Behavior 找到解决方案,我仍然会感兴趣。
我想创建一个自定义绑定行为,允许我检测对象属性的任何更改,如下所示:
<my-form model.bind="myObject & objectObserver:myObjChanged()"></my-form>
我知道我可以使用 Aurelia 的绑定引擎创建一个 属性 观察者,也许我可以将其构建到自定义绑定行为中以检测对象的属性并创建 属性 观察者为每一个。但是我无法理解在自定义绑定行为中提供给我的绑定对象。到目前为止,这是我的代码:
import { inject, bindingBehavior, BindingEngine } from 'aurelia-framework';
@bindingBehavior('objectObserver')
@inject(BindingEngine)
export default class ObjectObserverBindingBehavior {
constructor(bindingEngine) {
this.bindingEngine = bindingEngine;
}
bind(binding, scope, interceptor) {
console.warn('hello', binding, scope, interceptor);
}
unbind(binding, scope) {
console.warn('observer.unbind()', binding, scope);
}
}
当绑定发生并输出控制台文本时,我明白了
所以我知道它有效,但我不知道开始观看的最佳对象是什么。我在 targetObserver.currentValue 中看到了绑定对象。这是开始观看的最佳 属性 吗?有没有其他方法可以利用 Aurelia 绑定引擎的现有功能?
我找到了一个不是特定于 Aurelia 的解决方案,它基于 Javascript 中内置的 Proxy 功能。
export function onChangeObj(object, onChange) {
// creates Proxy to detect changes in object properties and call a function
if (typeof onChange !== 'function' || typeof object !== 'object') {
throw new Error('onChangeObj: incorrect parameters');
}
const handler = {
set(obj, prop, value) {
onChange(prop, value);
return Reflect.set(obj, prop, value);
},
};
return new Proxy(object, handler);
}
为了使用它,就这样调用它:
this.myObject = onChangeObj(this.myObject, () => this.myObjChanged());
实际上,对象被包装代理替换,每次修改其中一个属性时调用提供的函数(使用 setter)。
如果有人通过 Aurelia Binding Behavior 找到解决方案,我仍然会感兴趣。