如何使 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
分配给某个地方,那么你就不会得到它的价值。
我正在尝试创建一个计算 属性,每当深层嵌套对象中的任何值发生变化时,我都希望重新计算它。我知道 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
分配给某个地方,那么你就不会得到它的价值。