如何使 Ember 计算 属性 依赖于变量的所有后代属性?

How can I make an Ember computed property depend on all descendent properties of a variable?

我正在尝试创建一个计算 属性,每当深层嵌套对象中的任何值发生变化时,我都希望重新计算它。我知道 myObj.[] 可用于在数组中的任何对象发生更改时重新评估计算属性,但我希望这是递归的。

例如我有

// should recalculate whenever myObj.x.y.z changes, or when myObj.a.b.c changes
computed('myObj', function() {
  // ...
})

我事先并不知道对象到底是如何构造的,它可能是任意深度。

computed('myObj.[]', ...)computed('myObj.@each', ...) 似乎都不适合这个。

知道怎么做吗?

在Ember中可以在运行时定义计算属性

import { defineProperty, computed } from '@ember/object';

// define a computed property
defineProperty(myObj, 'nameOfComputed', computed('firstName', 'lastName', function() {
  return this.firstName+' '+this.lastName;
}));

因此更进一步,您 可以 在运行时动态创建您想要的任何计算 属性 键字符串(这可能在组件的 init()或其他):

// define a computed property
let object = {
   foo: 'foo',
   bar: 'bar'
}
this.set('myObj', object);
let keys = Object.keys(object).map((key) => {
  return `myObj.${key}`
});
defineProperty(this, 'someComputed', computed.apply(this, [...keys, function() {
  // do something here
}]));

由您决定如何正确地递归遍历所有依赖键的对象,而无需创建循环或访问您不想要的原型键……或者考虑一下这是否很好一个想法。或者,您可以尝试以重新触发计算的方式处理这些属性的设置(这更符合 DDAU)。我只能根据您提供的内容进行推测,但当然可以按照您的意愿行事。查看 this twiddle 的实际效果

could you try anyone computed/obeserver like below..
But try to prefer the computed.

import { observer } from '@ember/object';
import EmberObject, { computed } from '@ember/object';

partOfNameChanged1: observer('myObj','myObj.[]','myObj.@each', function() {
  return 'myObj is changed by obeserver';
})

partOfNameChanged2: computed ('myObj','myObj.[]','myObj.@each', function() {
  return 'myObj is changed by computed';
})

then in your handlebar/template file

{{log 'partOfNameChanged1 is occured' partOfNameChanged1}}
{{log 'partOfNameChanged2 is occured' partOfNameChanged2}}

然后你必须 associate/assign 这个 partOfNameChanged1 / partOfNameChanged2 到把手中的某个地方或 .js 文件中的任何其他变量。 只要你没有将这个 computed/observer 属性 partOfNameChanged1 /partOfNameChanged2 分配给某个地方,那么你就不会得到它的价值。