2016-09-26 3 views
0

Я пробивал себе голову последние несколько дней, пытаясь понять, что я делаю неправильно. Я реализую инфраструктуру списков для своего приложения, которая может включать в себя paging/infinite scroll/filtering/grouping/ и т. Д. Реализация основана на расширении контроллеров (а не контроллеров массивов, я хочу быть безопасным Ember 2.0), с использованием свойства массива content, которое хранит данные.Ember.computed.sort собственность не обновляется

Я использую Ember.computed.sort для сортировки, и он работает, но у меня странное поведение, когда я пытаюсь изменить сортировщик. sortedContent не обновляется в пределах displayContent, хотя определения sortingDefinitions обновляются.

Это вызывает странное поведение, что он будет сортировать только если I 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') 

Edit: фиксируется путем добавления еще одной зависимости к 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