更新的答案
现在支持此功能。依赖字符串不再需要是简单的属性访问表达式(例如['firstName', 'lastName']
)。任何可以在绑定表达式中工作的东西也可以在declarePropertyDependencies
. 例子:
declarePropertyDependencies(Welcome, 'fullName', ['person.firstName', 'person.lastName']);
declarePropertyDependencies(Welcome, 'fullName', ['person.foo().bar[baz], 'x.y.z()']);
原始答案
当前不支持此方案declarePropertyDependencies
。您可以直接使用 Aurelia 的 ObserverLocator 类,也可以像这样创建一个包装它的类:
多观察者.js
import {ObserverLocator} from 'aurelia-framework'; // or 'aurelia-binding'
export class MultiObserver {
static inject() { return [ObserverLocator]; }
constructor(observerLocator) {
this.observerLocator = observerLocator;
}
observe(properties, callback) {
var subscriptions = [], i = properties.length, object, propertyName;
while(i--) {
object = properties[i][0];
propertyName = properties[i][1];
subscriptions.push(this.observerLocator.getObserver(object, propertyName).subscribe(callback));
}
// return dispose function
return () => {
while(subscriptions.length) {
subscriptions.pop()();
}
}
}
}
欢迎.js
import {MultiObserver} from 'multi-observer';
export class Welcome {
static inject() { return [MultiObserver]; }
constructor(multiObserver) {
this.person = { firstName: 'John', lastName: 'Doe' };
this.updateFullName();
// update fullName when person.firstName/lastName changes.
this.dispose = multiObserver.observe(
[[person, 'firstName'],
[person, 'lastName']],
() => this.updateFullName());
}
updateFullName() {
this.fullName = `${this.person.firstName} {this.person.lastName}`;
}
deactivate() {
this.dispose();
}
}
更多信息在这里。Aurelia 的未来版本将包含更多 API 和文档,以支持这些常见的对象观察场景。
如果您只需要显示计算值,则解决方案要简单得多 - 在您的视图中执行此操作:
<template>
Full Name: ${person.firstName} ${person.lastName}
</template>
我不认为这是你要问的,但以防万一......