Aurelia:修改ANY属性后的通知

时间:2018-11-08 16:56:53

标签: binding aurelia aurelia-binding

您是否看到任何方法来知道何时通过绑定修改了任何模型的属性? 我需要通用的东西,因为它将应用于所有形式的应用程序。这意味着我不能仅对模型的每个属性都有一个“ property” Changed()可观察的回调。我正在考虑重写绑定引擎创建的属性设置器的方法,以便它们可以调用单个已定义的回调,但是我觉得有更好的方法。

2 个答案:

答案 0 :(得分:1)

我为这种情况(以及更多)创建了aurelia插件。 它不完全是您的要求,但可以为您提供很多帮助。 因为该插件将创建一个名为isDirty的属性,您可以观察并相应地激发代码。

https://github.com/avrahamcool/aleph1-aurelia-utilities

查看Dirty Tracking a model:部分

  

您的模型类需要扩展插件提供的baseClass。   现在,您可以使用来装饰模型的任何属性   @dirtyTrack()装饰器。

     

对于babel用户:声明中的分配将设置   属性的默认值。对于TS用户:您应该致电   参数@dirtyTrack(7)的装饰器someInt:number;

     

这将在模型中设置一个isDirty变量。该属性将   跟踪的每一次更改都会自动更新为   属性。

     

在任何时候,您都可以在模型上调用saveChanges()来提交   当前的变化。或throwsChanges()还原为上一个保存的   点。您可以调用serialize()从模型中获取pojo对象,   或反序列化(pojo)以从pojo对象填充模型。

答案 1 :(得分:0)

好吧,我最终只是使用绑定引擎来观察所有属性更改。这使我无需修改现有模型即可实现isDirty检查。

所以最终代码如下:

Object.getOwnPropertyNames(obj).forEach(p => {
        this.subscriptions.push(this.binding.propertyObserver(obj, p)
           .subscribe(() => this.updateDirty()));
    });
每次更改属性后都会调用

我的 updateDirty()方法,并且无需对模型进行任何更改。

如果有人能提出更好的解决方案,我仍然很感兴趣,但这暂时满足了我的需求。