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