我正在尝试观察绑定到自定义属性的对象特定属性的更改事件。我为此使用bindable
标记。
对象
var information = {
name: 'foo',
description: 'bar',
age: 12
};
元素
<div my="info: information;"></div>
属性
@customAttribute('my')
export class MyCustomAttribute {
@bindable({
changeHandler: 'change'
})
public info: any;
private change(): void {
console.log('info has changed')
}
}
以上示例仅触发一次更改处理程序。但是每当info
对象上的某个属性发生变化时,我都需要触发它。在我的用例中,哪个属性发生变化并不重要,我只需要知道属性何时发生变化。
关于如何做到的任何想法?
FYI =&gt;一种不同的方法是在视图模型上创建一个单独的属性(并在其上使用可绑定标记)而不是使用该对象,但我宁愿不这样做,因为它会使HTML中属性的管道繁琐(因为财产的数量)。
答案 0 :(得分:1)
我设法以这种方式解决了这个问题; (感谢Marc Scheib的评论)
import { BindingEngine, Disposable } from 'aurelia-framework';
@customAttribute('my')
export class MyCustomAttribute {
@bindable public info: any;
private subscription: Disposable;
constructor(
private binding_engine: BindingEngine
) { }
public attached(): void {
this.subscription = this.binding_engine
.propertyObserver(this.info, 'name')
.subscribe(() => this.change())
}
private change(): void {
console.log('info name property has changed')
}
public detached(): void {
this.subscription.dispose();
}
}
答案 1 :(得分:0)
据我所知,遗憾的是无法绑定到嵌套属性值。可观察系统基于Aurelia可以重写的属性,以便在更改时通知框架。因为您将更新嵌套属性而不是info
属性本身,所以不会触发任何通知。我认为最好的方法是按照您在FYI中提到的那样做,然后创建一个单独的属性,然后您将观察。
关于风格的说明。您可能已经意识到这一点,但实际上并不需要这个@customAttribute('my')
装饰器。这将是Aurelia会议系统的默认行为,因此您可以将其保留,最终结果将是相同的。