1

当您设置 Aurelia 计算属性时,您可以声明依赖项以避免轮询(请参阅:Aurelia 变更检测的工作方式是持续轮询吗?)。

   get fullName(){
        return `${this.firstName} ${this.lastName}`;
    } 
}

declarePropertyDependencies(Welcome, 'fullName', ['firstName', 'lastName']);

但是,如果你想使用对象属性中的值,你会怎么做呢?

this.person = { firstName: 'John', lastName: 'Doe' }

get fullName(){
   return `${this.person.firstName} ${this.person.lastName}`;
}

当然,这显示得很好,但是当您更改 person.firstName 或 person.lastName 的值时,按照以下方式声明计算的依赖项不会触发更新:

declarePropertyDependencies(Welcome, 'fullName', ['person.firstName', 'person.lastName']);

也不是这个:

declarePropertyDependencies(Welcome, 'fullName', ['person']);

当前的 declareDependencies 代码可以做到这一点吗?

4

1 回答 1

5

更新的答案

现在支持此功能。依赖字符串不再需要是简单的属性访问表达式(例如['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>

我不认为这是你要问的,但以防万一......

于 2015-03-27T02:48:03.830 回答