Создание фильтров в EmberJS — Концепция

#javascript #ember.js

#javascript #ember.js

Вопрос:

Мне нужны некоторые идеи о том, как создать фильтр поиска в EmberJS, где результаты поиска могут сохраняться в разных представлениях. Допустим, у меня есть список контактов, и я отфильтровал список. Предположим, что этот маршрут вызывается Contacts/Index

Теперь у меня есть второй маршрут, который называется Contacts/Details . Пользователь будет перенаправлен на этот маршрут, как только он выберет результат из списка контактов. Теперь, когда они нажимают «Вернуться к контактам», я хочу, чтобы предыдущий фильтр по-прежнему применялся вместо отображения всех контактов.

Я еще не написал никакого кода, поэтому не могу предоставить JSFiddle. Все, о чем я могу думать сейчас, вероятно, это создать глобальную переменную для отслеживания текста, который используется для фильтрации, и применять его при переходе обратно к Contacts/Index представлению, но я не уверен, что это правильный способ сделать это.

Ответ №1:

Это всего лишь псевдокод, которому на самом деле все равно, какой у вас тип фильтра, но вы могли бы применить свойство filter к ContactsIndexController :

 App.ContactsIndexController = Ember.ArrayController.extend({
  //...
  filter: 'name=bro',
  filteredContent: function () {
    if(this.get('filter')){
      return this.get('content').filter//...;
    } else {
      return this.get('content');
    }
  }.property('filter')
  //...//
});
  

Всякий раз, когда вы меняете фильтр, обязательно обновляйте filter свойство:

 this.set('filter', 'foo=bar');
  

Затем в вашем шаблоне handlebars вы всегда перебираете filteredContent :

 {{#each filteredContent}}
{{/each}}
  

При переходе туда и обратно между Contacts внутренними маршрутами фильтр должен сохраняться при возврате к индексу.

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

С другого контроллера:

this.set('controllers.contacts-index.filter', 'year=20x6')

Из маршрута:

this.controllerFor('contacts-index').set('filter', 'year=20x6')

Из представления в контроллере индекса:

this.set('controller.filter', 'year=20x6')

Я уверен, вы поняли идею.

Это, конечно, один из нескольких подходов, которые вы могли бы использовать. Я предпочитаю этот конкретный шаблон.

Надеюсь, это поможет и удачи!

Комментарии:

1. Это потрясающе, Мэтью. Спасибо за концепцию. Очень признателен.