在Aurelia计算中,在设置依赖关系时,如何声明对象属性的依赖关系

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代码?

Jer*_*yow 5

更新的答案

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

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