1
給定一個產品列表頁面與一些過濾器(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
等
這種解決方案可能不是最好的,但我想保持一個「灰燼的方式」來做到這一點,只有用公共API(例如不是_suspendObservers
)。
我怎麼能做到這一點?也許在某處使用運行循環?
編輯
還請注意,我知道視圖可以發送的行動,而不是僅僅改變性質的,所以控制器將看起來像這樣:
App.ProductsController = Ember.ArrayController.extend({
actions: {
queryDidChange: function() {
this.setProperties({
status: null,
page: 1
});
this.send('reloadModel');
},
// code omitted
}
});
但這種方法似乎有點冗長並且不要使用觀察者的約束力,所以我希望有更好的方法來做到這一點。
謝謝,但它不能對所有的情況下工作。例如,當查詢發生變化時,其頁面被其觀察者設置爲1,所以'parametersDidChange'被調用兩次(因爲查詢和頁面都發生了變化)。即使我刪除'parametersDidChange'觀察者,並在每個觀察者的末尾執行'this.send('reloadModel');'它將不起作用:如果用戶選擇了一個'status',則問第二個'頁面「,當他想清除」狀態「時,頁面需要設置爲」1「。使用if(this.get('status'))'條件,頁面不會被清除,因爲狀態將爲'null' – louiscoquio
你是可行的,這只是一個工作,並不是很燼。 .. – Edu