2016-09-26 118 views
0

我在過去的幾天裏一直在努力理解我做錯了什麼。 我正在實施我的應用程序列表的基礎結構,其中可能包括paging/infinite scroll/filtering/grouping/等。該實現基於擴展控制器(不是陣列控制器,我想要成爲Ember 2.0安全),其中包含數據屬性爲content的數組。Ember.computed.sort屬性沒有更新

我正在使用Ember.computed.sort進行排序,它正在工作,但當我嘗試更改分揀機時,我遇到了一個奇怪的行爲。 在displayContent內沒有更新,即使更新了定義sortingDefinitions

這會導致一個奇怪的行爲,它只會排序如果我sort它兩次,就好像排序是異步的。

我使用Ember 1.5(但它也發生在1.8) (附加的代碼解釋我的問題的一個片段)

sortingDefinitions: function(){ 
    var sortBy = this.get('sortBy'); 
    var sortOrder = this.get('sortOrder') || 'asc'; 

    if (_.isArray(sortBy)) { 
     return sortBy; 
    } 
    else { 
     return (sortBy ? [sortBy + ':' + sortOrder] : []); 
    } 
}.property('sortBy', 'sortOrder'), 

sortedContent: Ember.computed.sort('content', 'sortingDefinitions'), 




displayContent: function() { 
    var that = this; 
    var sortBy = this.get('sortBy'); 
    var sortOrder = this.get('sortOrder'); 
    var list = (sortBy ? this.get('sortedContent') : this.get('content')); 

    var itemsPerPage = this.get('itemsPerPage'); 
    var currentPage = this.get('currentPage'); 
    var listItemModel = this.get('listItemModel'); 

    return list.filter(function(item, index, enumerable){ 
     return ((index >= (currentPage * itemsPerPage)) && (index < ((currentPage + 1) * itemsPerPage))); 
    }).map(function(item) { 
     var listItemModel = that.get('listItemModel'); 
     if (listItemModel) { 
      return listItemModel.create(item); 
     } 
     else { 
      return item; 
     } 
    }); 

}.property('content.length', 'sortBy', 'sortOrder', 'currentPage', 'itemsPerPage') 

編輯: 通過添加另一個依賴於displayContent(sortedContent固定。 []):

displayContent: function() { 
    .... 

}.property('content.length', 'sortBy', 'sortOrder', 'currentPage', 'itemsPerPage' , 'sortedContent.[]') 
+0

注意,它適用於我的單元測試的罰款。渲染循環的東西在這裏搞砸了。 – Manu

回答

1

你的排序函數正在觀看整個陣列sortingDefinitions代替的陣列中的每個元件。如果數組更改爲字符串或其他變量,它會更新,但如果數組中的元素髮生更改,則不會更新。

要正確確保您的計算機屬性更新,添加.[]到數組的末尾,以便它看起來像這樣:Ember.computed.sort('content', 'sortingDefinitions.[]')

+0

但整個陣列正在被替換。真正奇怪的部分是,當它排序兩次它的作品。 (試過你的解決方案,無論如何,沒有工作:) :( – Manu

+0

好吧,我發現這個問題,並沒有那麼不同 添加'sortedContent。[]'到displayContent屬性列表做了伎倆。 – Manu

相關問題