2016-01-21 114 views
1

我想使用属性依赖关系来避免对计算属性进行脏检查。由于计算属性所依赖的属性不是基元,而是对象的属性,所以我不知道如何使其工作。对象属性的属性依赖关系

代码:

import {computedFrom} from 'aurelia-framework'; 

export class Person { 
    personData = { 
     firstName: 'John', 
     lastName: 'Doe', 
     // More attributes... 
    } 

    // ... 

    // Doesn't work: 
    @computedFrom('personData.firstName', 'personData.lastName') 
    // Neither does: 
    // @computedFrom('personData["firstName"], 'personData["lastName"]') 
    // Nor: 
    // @computedFrom('personData') 
    get fullName() { 
     return `${this.personData.firstName} ${this.personData.lastName}`; 
    } 

    // ... 
} 

回答

2

@computedFrom属性将很快添加对以下词组盯紧https://github.com/aurelia/binding/pull/276

支撑警告字 - 过度使用@computedFrom(例如@computedFrom(p1.p2.p3, p4.p5, p6, p7, p8))最终可能会比脏检查性能低。在观察者的一次性设置与连续功能评估之间有一个折衷与脏检查 - 你的里程可能会有所不同。

另一种选择是使用with在您看来约束力,直接绑定到你的对象道具:

<span with="personData">${firstName} ${lastName}</span> 

最后但并非最不重要的,还有的aurelia-computed插件,它可以解析getter函数机构和生产观察员不使用脏检查:https://github.com/jdanyow/aurelia-computed

+0

已添加回来吗? –

0

我想补充观察家对personData属性(https://stackoverflow.com/a/28437456/3436921)和手动设置fullName

使用@computedFrom( 'personData'),并始终创造新personData当属性改变this.personData = Object.assign({}, this.personData, {firstName: "new first name"})

+0

如果事实证明'computedFrom'装饰器不支持对象属性,那么观察者将是一个选项。第二个建议是没有选择的,因为'personData.firstName'和'personData.lastName'绑定到UI输入控件,并且手动拦截数据流以始终创建一个新的'personData'对象太麻烦了,没有好的样式。 – suamikim