3

私は計算されたプロパティに値を直接設定することに関するバグに直面していると思います。これは、関連するキーが再び変更されたときに計算を中断するように見えます。ここに例を示します。

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. 計算されたプロパティ v2 を「set」で直接更新するまで、すべてが正常に機能します。v1 を再度更新すると、v2 は再評価されません。

  2. v2 を直接設定すると、そのオブザーバーが 2 回呼び出されます。

ドキュメント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!!!"
4

2 に答える 2

1

例を実行すると、コンソールに次のように表示されます

> oi = o.create();

> oi.set('v1', 'Value v1 one');
[Log] evaluation of v2 ["v2"]
[Log] v2 changed: Value v1 one!!!
[Warning] v1 changed: Value v1 one

> oi.set('v2', 'Value direct to v2');
[Log] v2 changed: Value direct to v2

> oi.set('v1', 'Value v1 two');
[Log] v2 changed: Value direct to v2
[Warning] v1 changed: Value v1 two

v2 を直接設定する場合のリスト項目は、そのオブザーバーが 2 回呼び出されます。

お気づきかもしれませんが、'v2' のオブザーバーは、最初に の値を設定したため、連続して 2 回呼び出されますv1。これにより、再計算が行われ、オブザーバーが起動し、直接v2設定すると 2 回目に実行されます。つまり、何もありません。v2不思議に思う。

リスト項目 計算されたプロパティ v2 を「set」で直接更新するまで、すべてが正常に機能します。v1 を再度更新すると、v2 は再評価されません。

手動で設定v2したら、基本的に計算されたプロパティを削除して値だけに置き換えるように指示します (基本的にv2は関数であり、値に設定します)。なぜ再評価するのですか?

于 2013-07-06T16:51:49.627 に答える