Я пробивал себе голову последние несколько дней, пытаясь понять, что я делаю неправильно. Я реализую инфраструктуру списков для своего приложения, которая может включать в себя 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.[]')
отмечают, что она отлично работает на моем юнит-тестов. что-то с контуром рендеринга перепутано здесь. – Manu