2015-03-25 2 views
1

Сначала у меня есть сортировка контроллеров, затем к ним применяется фильтр. К сожалению, когда я использую {{#each post in filteredPosts}} в своем шаблоне, они не обновляются.Невозможно наблюдать вычисленное свойство

Как добиться сортировки по нескольким столбцам (в разных направлениях), а затем фильтрация И все еще есть новые и удаленные сообщения в списке вживую?

импорт Эмбер из 'ember';

export default Ember.ArrayController.extend({ 
    sortProperties: ['isPublished:asc', 'createdAt:desc'], 
    sortedPosts: Ember.computed.sort('model', 'sortProperties'), 
    filterPost: '', 

    filteredPosts: function() { 
    var filterText = this.get('filterPost').toLowerCase() 
    return this.get('sortedPosts').filter(function(post){ 
     return post.get('title').toLowerCase().indexOf(filterText) > -1 
    }) 
    }.observes('sortedPosts').property('filterPost'), 

}); 

ответ

3

У вашего компьютерного объекта есть две вещи не так.

  1. Используется как .observes(), так и .property(). Вам нужно только .property(). .observes() предназначен для тех случаев, когда вы хотите изменить побочные эффекты при обновлении свойств.
  2. Вы смотрите только sortedPosts, что означает, что ваша собственность будет пересчитывать только при изменении итерации sortedPosts, а не при изменении какого-либо содержимого. Поскольку вы фильтруете свойство title, вы должны смотреть это на каждом экземпляре. Вы можете узнать больше об этом here.

Ваше вычислен свойство должно выглядеть примерно так:

filteredPosts: function() { 
    ... 
}.property('[email protected]', 'filterPost') 
+0

Спасибо большое. Отличный ответ. – Hedge