Aurelia:如何观察绑定对象的特定属性(自定义属性)

时间:2017-09-03 21:11:53

标签: aurelia bindable

我正在尝试观察绑定到自定义属性的对象特定属性的更改事件。我为此使用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中属性的管道繁琐(因为财产的数量)。

2 个答案:

答案 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会议系统的默认行为,因此您可以将其保留,最终结果将是相同的。