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

Javascript 在Aurelia computeds中,当设置依赖项时,如何声明对对象属性的依赖项,javascript,aurelia,Javascript,Aurelia,设置Aurelia computed属性时,可以声明依赖项以避免轮询(请参阅:) 但是,如果要使用对象属性中的值,您将如何执行此操作 this.person = { firstName: 'John', lastName: 'Doe' } get fullName(){ return `${this.person.firstName} ${this.person.lastName}`; } 当然,这显示得很好,但是当您更改person.firstName或person.lastName

设置Aurelia computed属性时,可以声明依赖项以避免轮询(请参阅:)

但是,如果要使用对象属性中的值,您将如何执行此操作

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']
)。在绑定表达式中工作的任何内容都将在
declarePropertyDependencies
中工作。示例:

  • declarePropertyDependencies(欢迎使用,'fullName',['person.firstName','person.lastName']
  • declarePropertyDependencies(欢迎使用,'fullName',['person.foo().bar[baz],'x.y.z()')

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

multi-observer.js

从'aurelia framework'导入{ObserverLocator};//或“aurelia绑定”
导出类多观察者{
静态注入(){return[ObserverLocator];}
构造函数(观察者定位器){
this.observer定位器=observer定位器;
}
观察(属性、回调){
变量订阅=[],i=properties.length,object,propertyName;
而(我--){
对象=属性[i][0];
propertyName=属性[i][1];
push(this.observerLocator.getObserver(object,propertyName.subscribe(callback));
}
//返回处理函数
return()=>{
while(subscriptions.length){
订阅。pop();
}
}
}
}
欢迎光临

从'multi-observer'导入{multi-observer};
导出类欢迎{
静态注入(){return[MultiObserver];}
构造函数(多观察者){
this.person={firstName:'John',lastName:'Doe'};
this.updatealName();
//person.firstName/lastName更改时更新全名。
this.dispose=multiObserver.observe(
[[个人,“名字”],
[个人,姓氏]],
()=>this.updateFullName());
}
UpdateFileName(){
this.fullName=`${this.person.firstName}{this.person.lastName}`;
}
停用(){
这个。dispose();
}
}
更多信息。Aurelia的未来版本将包括更多API和文档,以支持这些常见的对象观察场景

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

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

全名:${person.firstName}${person.lastName}
我不认为这是你要问的,但以防万一…

更新的答案 这一点现在得到了支持。依赖项字符串不再需要是简单的属性访问表达式(例如
['firstName','lastName']
)。在绑定表达式中工作的任何内容都将在
declarePropertyDependencies
中工作。示例:

  • declarePropertyDependencies(欢迎使用,'fullName',['person.firstName','person.lastName']
  • declarePropertyDependencies(欢迎使用,'fullName',['person.foo().bar[baz],'x.y.z()')

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

multi-observer.js

从'aurelia framework'导入{ObserverLocator};//或“aurelia绑定”
导出类多观察者{
静态注入(){return[ObserverLocator];}
构造函数(观察者定位器){
this.observer定位器=observer定位器;
}
观察(属性、回调){
变量订阅=[],i=properties.length,object,propertyName;
而(我--){
对象=属性[i][0];
propertyName=属性[i][1];
push(this.observerLocator.getObserver(object,propertyName.subscribe(callback));
}
//返回处理函数
return()=>{
while(subscriptions.length){
订阅。pop();
}
}
}
}
欢迎光临

从'multi-observer'导入{multi-observer};
导出类欢迎{
静态注入(){return[MultiObserver];}
构造函数(多观察者){
this.person={firstName:'John',lastName:'Doe'};
this.updatealName();
//person.firstName/lastName更改时更新全名。
this.dispose=multiObserver.observe(
[[个人,“名字”],
[个人,姓氏]],
()=>this.updateFullName());
}
UpdateFileName(){
this.fullName=`${this.person.firstName}{this.person.lastName}`;
}
停用(){
这个。dispose();
}
}
更多信息。Aurelia的未来版本将包括更多API和文档,以支持这些常见的对象观察场景

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

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

全名:${person.firstName}${person.lastName}

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

我猜您需要更新答案,因为最新的Aurelia本机支持此功能。@huocp感谢您告知我此功能已过时。我猜您需要更新答案,因为最新的Aurelia本机支持此功能。@huocp感谢您告知我此功能已过时。