私は計算されたプロパティに値を直接設定することに関するバグに直面していると思います。これは、関連するキーが再び変更されたときに計算を中断するように見えます。ここに例を示します。
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つのバグがあると思います:
計算されたプロパティ v2 を「set」で直接更新するまで、すべてが正常に機能します。v1 を再度更新すると、v2 は再評価されません。
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!!!"