2014-02-02 3 views
0

У меня есть следующий код, который фильтрует содержимое на одном из моих контроллеров. Шаблон пересекает вычисляемое свойство и отображает элементы. Затем у меня есть текстовый ввод, который фильтрует контент. Все работает отлично, за исключением случаев, когда имеется большое количество элементов, фильтрация становится медленной. Я прочитал нить в другом месте с ответом Тома Дейла, который попытался объяснить это, но пример возвращал 404.Ускорить медленный фильтр содержимого Ember

Куда я иду дальше, пытаясь ускорить это?

Вот код:

Контроллер:

App.PlaylistIndexController = Ember.ObjectController.extend({ 
    filterString: null, 
    filteredSongs: function() { 
     var filter = this.get('filterString'); 
     if(filter == undefined) return this.get('content.songs'); 
     filter = filter.toLowerCase(); 
     return this.get('content.songs').filter(function(item, index, enumerable){ 
      if(item.get('artist').toLowerCase().match(filter.toLowerCase()) || item.get('name').toLowerCase().match(filter.toLowerCase())) 
       return item; 
     }); 
    }.property('content.songs', 'filterString') 
}); 

Шаблон:

{{#each song in controller.filteredSongs}} 
    {{song}}{{!-- some song stuff--}} 
{{/each}} 

Фильтр вход:

{{input valueBinding='filterString' placeholder='Search for songs within playlist'}} 
+0

Я - Ember noob, но можете ли вы использовать '@ each' в своей собственности? Что-то вроде ''content.songs. @ Each.artist', 'content.songs. @ Each.name''? Я, честно говоря, понятия не имею, повлияет ли это на производительность:/ –

+0

Я думаю, что вы могли бы ... но, по моему мнению, это проблема с повторным рендерингом контента на каждое нажатие клавиши. – paulruescher

ответ

3

Вы можете попробовать это:

JSBIN Using Ember.run.later

onInputFilterChanged: function(){ 
     this.set('canProceedFiltering', false); 
     Ember.run.later(this, function(){ 
     this.set('filterString', this.get('inputFilterString')); 
     this.set('canProceedFiltering', true); 
     },500); 
}.observes('inputFilterString') 

Таким образом, пользователь может ввести текстовый фильтр и поиск будет срабатывать только после того, как пользователь имеет тип в более конкретных критериев. Недостатком является поиск одиночного символа, который займет полсекунды больше.

+0

. Я в порядке с задержкой при возврате результатов поиска, это просто, что даже в этом примере наблюдается заметное отставание при вводе в поисковый запрос (например, попробуйте ввести «red1» vs «red12», а затем очистите запрос нажатие backspace) – paulruescher

+0

, то вы могли бы использовать это: нарисуйте все элементы в DOM и покажите им asper фильтр: http://emberjs.jsbin.com/oXaNOQO/11/ – jacquard

+1

Я бы, вероятно, реализовал 'debounce' в этот , это сделает так, чтобы пользователь не почувствовал задержку, если они не перестали печатать ... http://emberjs.jsbin.com/oXaNOQO/13/edit – Kingpin2k

Смежные вопросы