在我的 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
的...只创建一次,然后循环遍历它们以仅呈现结果?CollectionView
也许我的数组?清空 后tbody
,是否RowViews
仍然有它们的el
或现在为 null 并需要重新渲染?
问题2,模型选择
你会注意到我在我的RowView
. 我想在某处有一个详细视图来处理该事件并显示我的整个模型。当我搜索我的列表时,如果我选择的模型保留在搜索结果中,我想保持该状态并让它保留在我的详细视图中。一旦它不再出现在我的结果中,我将清空详细视图。所以我当然需要管理一系列视图,对吧?我考虑过一个双重链接的结构,其中每个视图都指向它的模型,每个模型都指向它的视图......但是如果我将来要在我的模型上实现一个单例工厂,我不能将它强加于模型。:/
那么管理这些视图的最佳方法是什么?