2013-10-17 68 views
1

給定一個產品列表頁面與一些過濾器(querystatuspageperPage)不能一起工作:尋找灰燼的方法來處理過濾

  • 當用戶寫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 
    } 
}); 

但這種方法似乎有點冗長並且不要使用觀察者的約束力,所以我希望有更好的方法來做到這一點。

回答

0

我不知道該如何暫停觀察員灰燼,但宥可以在觀察函數用條件來實現這一

queryDidChange: function() { 
    if(this.get('query')){ 
    this.setProperties({ 
     status: null, 
     page: 1 
    }); 
    } 
}.observes('query'), 

statusDidChange: function() { 
    if(this.get('status')){ 
    this.setProperties({ 
     query: null, 
     page: 1 
    }); 
    } 
}.observes('status'), 
+0

謝謝,但它不能對所有的情況下工作。例如,當查詢發生變化時,其頁面被其觀察者設置爲1,所以'parametersDidChange'被調用兩次(因爲查詢和頁面都發生了變化)。即使我刪除'parametersDidChange'觀察者,並在每個觀察者的末尾執行'this.send('reloadModel');'它將不起作用:如果用戶選擇了一個'status',則問第二個'頁面「,當他想清除」狀態「時,頁面需要設置爲」1「。使用if(this.get('status'))'條件,頁面不會被清除,因爲狀態將爲'null' – louiscoquio

+0

你是可行的,這只是一個工作,並不是很燼。 .. – Edu