Gen*_*ick 1 javascript aurelia
当您设置Aurelia计算属性时,您可以声明依赖关系以避免轮询(请参阅:Aurelia的更改检测是否正常工作的常量轮询?).
get fullName(){
return `${this.firstName} ${this.lastName}`;
}
}
declarePropertyDependencies(Welcome, 'fullName', ['firstName', 'lastName']);
Run Code Online (Sandbox Code Playgroud)
但是,如果要使用对象属性中的值,您将如何执行此操作?
this.person = { firstName: 'John', lastName: 'Doe' }
get fullName(){
return `${this.person.firstName} ${this.person.lastName}`;
}
Run Code Online (Sandbox Code Playgroud)
当然,这显示正常,但是当您更改person.firstName或person.lastName的值时,声明计算的依赖关系不会触发更新:
declarePropertyDependencies(Welcome, 'fullName', ['person.firstName', 'person.lastName']);
Run Code Online (Sandbox Code Playgroud)
这不是:
declarePropertyDependencies(Welcome, 'fullName', ['person']);
Run Code Online (Sandbox Code Playgroud)
这是否可以使用当前的declareDependencies代码?
现在支持此功能.依赖字符串不再需要是简单的属性访问表达式(例如['firstName', 'lastName']).任何可以在绑定表达式中起作用的东西也可以使用declarePropertyDependencies.例子:
declarePropertyDependencies(Welcome, 'fullName', ['person.firstName', 'person.lastName']);declarePropertyDependencies(Welcome, 'fullName', ['person.foo().bar[baz], 'x.y.z()']);目前不支持此方案declarePropertyDependencies.您可以直接使用Aurelia的ObserverLocator类,也可以创建一个包装它的类:
多observer.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()();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
welcome.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();
}
}
Run Code Online (Sandbox Code Playgroud)
更多信息在这里.未来版本的Aurelia将包含更多API和文档,以支持这些常见的对象观察场景.
如果您只需要显示计算值,那么解决方案就更简单了 - 在您的视图中执行此操作:
<template>
Full Name: ${person.firstName} ${person.lastName}
</template>
Run Code Online (Sandbox Code Playgroud)
我不认为这是你所要求的,但为了以防万一......
| 归档时间: |
|
| 查看次数: |
962 次 |
| 最近记录: |