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

In Aurelia computeds, when setting dependencies, how would declare a dependency on an object property

本文关键字:依赖 关系 声明 属性 对象 computeds Aurelia 设置 何声明      更新时间:2023-09-26

当您设置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']);

对于当前的declareDelationships代码,这可能吗?

更新的答案

现在支持此操作。依赖字符串不再需要是简单的属性访问表达式(例如['firstName', 'lastName'])。任何在绑定表达式中起作用的东西也将在declarePropertyDependencies中起作用。示例:

  • declarePropertyDependencies(Welcome, 'fullName', ['person.firstName', 'person.lastName']);
  • declarePropertyDependencies(Welcome, 'fullName', ['person.foo().bar[baz], 'x.y.z()']);

原始答案

declarePropertyDependencies当前不支持此方案。您可以直接使用Aurelia的ObserverLocator类,也可以创建一个这样包装它的类:

multiobserver.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()();
      }
    }
  }
}

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();
  }
}

点击此处了解更多信息。Aurelia的未来版本将包括更多的API和文档,以支持这些常见的对象观察场景。

如果你只需要显示计算值,解决方案要简单得多——在你的视图中这样做:

<template>
  Full Name:  ${person.firstName} ${person.lastName}
</template>

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