いくつかのフィルター ( query
、status
、page
、perPage
) が一緒に機能しない商品リスト ページがあるとします。
- ユーザーが を書き込む
query
と、status
フィルターがクリアされ、page
1 に設定されます。 - ユーザーがフィルターを選択する
status
と、query
フィルターがクリアされ、page
1 に設定されます。 - ユーザーが を変更する
perPage
と、page
が 1 に設定されます (他のフィルターはそのまま残ります)。 - ユーザーが を変更しても
page
、フィルターはそのまま残ります。
これを実装しようとした方法は次のとおりです。
App.ProductsController = Ember.ArrayController.extend({
query: null,
status: null,
page: 1,
perPage: 15,
queryDidChange: function() {
this.setProperties({
status: null,
page: 1
});
}.observes('query'),
statusDidChange: function() {
this.setProperties({
query: null,
page: 1
});
}.observes('status'),
perPageDidChange: function() {
this.set('page', 1);
}.observes('perPage'),
parametersDidChange: function() {
this.send('reloadModel');
}.observes('query', 'status', 'page', 'perPage'),
actions: {
reloadModel: function() {
// code omitted which makes API call using all filters set
}
}
});
しかし、query
変更すると、queryDidChange
オブザーバーが呼び出され、status
. がstatus
変更されると、オブザーバーが呼び出され、などstatusDidChange
がクリアされます。query
この種の解決策は最善ではないかもしれませんが、私はそれを行うための「Ember の方法」を維持し、公開 API のみを使用したいと考えています (例: ではありません_suspendObservers
)。
どうすればこれを達成できますか? おそらくどこかで実行ループを使用していますか?
編集
また、ビューがプロパティを変更するだけでなくアクションを送信できることもわかっているため、コントローラーは次のようになります。
App.ProductsController = Ember.ArrayController.extend({
actions: {
queryDidChange: function() {
this.setProperties({
status: null,
page: 1
});
this.send('reloadModel');
},
// code omitted
}
});
しかし、この解決策は少し冗長に見え、オブザーバーとバインディングの力を使用していないため、これをより適切に行う方法があることを願っています。