Несколько мест в моем приложении базовой линии. Я хотел бы иметь мгновенный поиск по коллекции, но мне сложно найти лучший способ реализовать Это.Backbone.js - Лучшая практика для реализации «мгновенного» поиска
Вот краткая реализация. http://jsfiddle.net/7YgeE/ Помните, что моя коллекция может содержать более 200 моделей.
var CollectionView = Backbone.View.extend({
template: $('#template').html(),
initialize: function() {
this.collection = new Backbone.Collection([
{ first: 'John', last: 'Doe' },
{ first: 'Mary', last: 'Jane' },
{ first: 'Billy', last: 'Bob' },
{ first: 'Dexter', last: 'Morgan' },
{ first: 'Walter', last: 'White' },
{ first: 'Billy', last: 'Bobby' }
]);
this.collection.on('add', this.addOne, this);
this.render();
},
events: {
'keyup .search': 'search',
},
// Returns array subset of models that match search.
search: function(e) {
var search = this.$('.search').val().toLowerCase();
this.$('tbody').empty(); // is this creating ghost views?
_.each(this.collection.filter(function(model) {
return _.some(
model.values(),
function(value) {
return ~value.toLowerCase().indexOf(search);
});
}), $.proxy(this.addOne, this));
},
addOne: function(model) {
var view = new RowView({ model: model });
this.$('tbody').append(view.render().el);
},
render: function() {
$('#insert').replaceWith(this.$el.html(this.template));
this.collection.each(this.addOne, this);
}
});
И крошечный вид для каждой модели ...
var RowView = Backbone.View.extend({
tagName: 'tr',
events: {
'click': 'click'
},
click: function() {
// Set element to active
this.$el.addClass('selected').siblings().removeClass('selected');
// Some detail view will listen for this.
App.trigger('model:view', this.model);
},
render: function() {
this.$el.html('<td>' + this.model.get('first') + '</td><td>' + this.model.get('last') + '</td>');
return this;
}
});
new CollectionView;
Вопрос 1
На каждом KeyDown, я фильтр коллекции, опорожнить tbody
, и сделать результаты, тем самым создавая новое представление для каждой модели. Я только что создал призрак, да? Было бы лучше правильно уничтожить каждую точку зрения? Или я должен попытаться управлять моими RowView
... создавая каждый из них только один раз и прокручивая их, чтобы отображать только результаты? Может быть, массив в моем CollectionView
? После опорожнения tbody
у RowViews
все еще есть их el
или это теперь нулевое значение и нужно повторно отобразить?
Вопрос 2, Выбор модели
Вы заметите, что я запуская пользовательское событие в моей RowView
. Я хотел бы иметь подробный вид где-нибудь, чтобы обработать это событие и отобразить всю мою модель. Когда я просматриваю свой список, если моя выбранная модель остается в результатах поиска, я хочу сохранить это состояние и оставить его в моем подробном представлении. Как только это больше не будет в моих результатах, я очищу подробный вид. Поэтому мне, безусловно, нужно будет управлять массивом взглядов, не так ли? Я рассмотрел структуру с двойной связью, в которой каждая точка зрения указывает на ее модель, а каждая модель - на ее вид ... но если я буду реализовывать одномоментную фабрику на своих моделях в будущем, я не могу наложить это на модель. :/
Итак, каков наилучший способ управления этими видами?
Спасибо, это чрезвычайно полезно. Мне очень нравится, что вы сделали с фильтром. В моих ранних попытках у меня тоже был охват, но он был жестко закодирован, и я как-то пропустил функцию 'pick' в документах. Кроме того, никогда не знал о функции «throttle», также очень полезен. –
Я все еще обнимаю то, как у вас есть вещи, и я не совсем продаюсь за использование 'setElement'. Мне кажется нелепо, что нужно переделывать события на каждом рендере. Я никогда не видел эту технологию прививки, где вы визуализируете элементы списка в CollectionView и трансформируете ItemViews ... Я не привык к тому, что ItemView не отвечает за рендеринг себя, и, с одной стороны, кажется, что это разделение проблем, которые должны произойти, но, с другой стороны, удивительно прямолинейны, так как всегда проще, чтобы шаблон повторялся по нашим коллекциям. –
@savinger 'setElement' в основном по косметическим соображениям и для« самодостаточности »шаблонов, этот метод был бы более полезен, если бы вам пришлось перегруппировать строки, например. Этот ответ может помочь вам понять мою точку зрения http://stackoverflow.com/questions/12004534/backbonejs-rendering-problems/12006179#12006179 – nikoshr