gpt4 book ai didi

ember.js - 直接设置后计算属性未更新

转载 作者:行者123 更新时间:2023-12-02 02:00:26 25 4
gpt4 key购买 nike

我认为我正面临一个关于直接将值设置为计算属性的错误,当它的相关键再次更改时似乎会中断计算,这里是一个例子:

o = Ember.Object.extend({
v1: null,
v2: function (){
console.log('evaluation of v2', arguments);
return this.get('v1') + '!!!';
}.property('v1'),
v1_Observer: function () {
console.warn('v1 changed:', this.get('v1'));
}.observes('v1'),
v2_Observer: function (){
console.info('v2 changed:', this.get('v2'));
}.observes('v2')
});

oi = o.create();
oi.set('v1', 'Value v1 one');
oi.set('v2', 'Value direct to v2');
oi.set('v1', 'Value v1 two');
Ember.assert('v2 should be "Value v1 two!!!"', oi.get('v2') === (oi.get('v1') + '!!!'));

我认为这里有 2 个错误:

  1. 一切正常,直到我直接用“set”更新计算属性 v2,当我再次更新 v1 时,v2 不会重新计算。

  2. 当直接设置 v2 时,它的观察者被调用了两次!

根据文档http://emberjs.com/guides/object-model/computed-properties/我们可以使用“set”直接设置计算属性的值,女巫将使用 2 个参数(键、值)进行调用!但在我的测试中,属性 v2 仅在 v1 第一次更改时触发一次。

这是控制台的输出:

evaluation of v2 ["v2"]
v2 changed: Value v1 one!!!
v1 changed: Value v1 one
v2 changed: Value direct
v2 changed: Value direct
v1 changed: Value v1 two
Assertion failed: v2 should be "Value v1 two!!!"

最佳答案

Ember 使用 runloop 来优化绑定(bind)并将 DOM 更新保持在最低限度。它通过将这些属性更改放在队列中来实现。然而,队列更聪明一些。

如果您要说在将某个属性呈现给 DOM 之前修改 10 次,它只会使用您为该属性设置的最后一个值。因此,当您需要在 DOM 中显示该属性时,只需更新一次。

此外,计算属性是一个函数,它根据传入的参数数量充当 getter 和 setter。语法是,

myProperty: function(key, value) {
if (value) {
// setter
} else {
// getter
}
}.property()

在上面的示例中,您只返回从相关 v1 计算的值。您还需要提供一个 setter,将值从 v2 计算属性返回到 v1

关于ember.js - 直接设置后计算属性未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17504871/

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