gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:38:24 24 4
gpt4 key购买 nike

当您设置 Aurelia 计算属性时,您可以声明依赖项以避免轮询(参见:Is constant polling the way Aurelia's change detection is working?)。

   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 代码中可行吗?

最佳答案

更新的答案

现在支持。依赖字符串不再需要是简单的属性访问表达式(例如 ['firstName', 'lastName'])。任何适用于绑定(bind)表达式的东西也适用于 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();
}
}

更多信息 here . Aurelia 的 future 版本将包含更多 API 和文档以支持这些常见的对象观察场景。

如果您只需要显示计算值,解决方案就简单得多 - 在您的 View 中执行此操作:

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

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

关于javascript - 在 Aurelia 计算中,设置依赖项时,如何声明对对象属性的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29289308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com