Несколько мест в моем приложении Backbone. Я хотел бы иметь мгновенный поиск по коллекции, но мне сложно найти лучший способ реализовать его.
Вот быстрая реализация. 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
При каждом нажатии клавиши я фильтрую коллекцию, пустую tbody
и выдаю результаты, создавая тем самым новое представление для каждой модели. Я только что создал призрак, да? Было бы лучше правильно уничтожить каждую точку зрения? Или я должен попытаться управлять моими RowView
s... создавая каждый из них только один раз и прокручивая их, чтобы отображать только результаты? Может быть, массив в моем CollectionView
? После опорожнения tbody
, у RowViews
все еще есть их el
или это теперь значение null и нужно повторно отобразить?
Вопрос 2, Выбор модели
Вы заметите, что я запускаю пользовательское событие в моем RowView
. Я хотел бы иметь подробный вид где-нибудь, чтобы обработать это событие и отобразить всю мою модель. Когда я просматриваю свой список, если моя выбранная модель остается в результатах поиска, я хочу сохранить это состояние и оставить его в моем подробном представлении. Как только это больше не будет в моих результатах, я очищу подробный вид. Поэтому мне, безусловно, нужно будет управлять массивом взглядов, не так ли? Я рассмотрел структуру с двойной связью, в которой каждая точка зрения указывает на ее модель, и каждая модель для нее просматривает... но если я буду использовать singleton factory для своих моделей в будущем, я не могу навязывать это на модели.:/
Так какой лучший способ управлять этими представлениями?