2

Ember のプロパティ オブザーバーで、いくつかの異常な動作が発生しています。実際のコードについては、この jfiddle を参照してください: http://jsfiddle.net/sBVtJ/3/

  1. オブザーバーが 2 つのプロパティを監視している場合、両方のプロパティが同時に更新されると、2 回発生します。
  2. オブザーバーが別のルートのコントローラーに設定されている場合、そのルートがアクティブになるまで (予期される) 起動しません。しかし、そのルートを離れると、オブザーバーは発砲し続けます (意図したものではありません)。

動作 2 に関する詳細: アプリを最初にロードするときに、[複数のプロパティ アクションを変更] をクリックすると、プロパティが増加し始めます。ただし、オブザーバーは解雇されません。次に、オブザーバー ルートに移動します。プロパティをインクリメントすると、オブザーバーが起動します。次に、インデックス ルートに戻ります。オブザーバーは、プロパティのインクリメントで引き続き起動します。いずれかのルートからプロパティがインクリメントされるたびに、オブザーバーが起動されます。私の意図した動作は、オブザーバー ルートがアクティブなときにのみオブザーバーを起動させることです。これを達成する方法はありますか?

動作 1 に対する私の質問: プロパティが同時に更新される場合でも、プロパティが更新されるたびにオブザーバーが 2 回起動することに注意してください。2 つのプロパティを同時に更新する場合、オブザーバーを 1 回だけ起動させることは可能ですか?

App = Ember.Application.create();

App.Router.map(function(){
    this.resource('observer');
});
App.Router.reopen({location:'none'});

App.ApplicationController = Ember.Controller.extend({
    consoleProp: function(){
        console.log(this.get('controllers.application.prop1'));
    },
    changeTwoProperties: function(){
        this.get('controllers.application').incrementProperty('prop1');
        this.get('controllers.application').incrementProperty('prop2');
    },
    prop1:0,
    prop2:0
});

App.IndexController = Ember.Controller.extend({
    needs: ['application'],
    changeTwoPropertiesBinding: 'controllers.application.changeTwoProperties',
    consolePropBinding: 'controllers.application.consoleProp'
});

App.ObserverController = Ember.Controller.extend({
    needs: ['application'],
    changeTwoPropertiesBinding: 'controllers.application.changeTwoProperties',
    consolePropBinding: 'controllers.application.consoleProp',

    theObserver: function(){
        console.log('observer fired');
    }.observes('controllers.application.prop1', 'controllers.application.prop2')
});
4

1 に答える 1

1

最初の部分では、 と を使用Ember.beginPropertyChanges()Ember.endPropertyChanges()ます。詳細については、このSOの回答を参照してください

Ember.beginPropertyChanges();
this.get('controllers.application').incrementProperty('prop1');
this.get('controllers.application').incrementProperty('prop2');
Ember.endPropertyChanges();

2 番目の動作については、さらに調査が必要です。オブザーバールートに行く前は作成されていないと思いObserverControllerますが、ルートを離れると破棄されません..

于 2013-02-08T07:15:55.860 に答える