我正在设置一个由 Backbone 驱动的应用程序。我面临一个“应该简单”的问题,我有一个名为“Message”的模型,一个名为“MessageList”的集合,以及一个名为“MessageView”和“MessageListView”的视图。
MessageListView 代码呈现 MessageList。我有 4 个切换按钮来过滤 MessageListView 显示的内容。过滤器按钮是“全部”、“活动”、“已标记”和“已忽略”。“全部”是页面加载时的初始过滤器。当用户按下“标记”过滤器时,只会出现带有标记==1 的消息。再次按下“全部”时,所有消息应再次出现。
我遇到的问题以及我的设计中的问题是,当我根据 filterString 过滤 Collection 时,对原始整个 Collection 的引用会丢失。因此,当再次按下“全部”时,消息已丢失。
我很好奇在 Backbone 中执行此操作的最佳方法...
这是设置代码...
var messageListView = new MessageListView({collection: messageList});
这是 MessageListView 代码...
MessageListView = Backbone.View.extend({
initialize : function() {
this.collection.on("add", function(model) {
var view = new MessageView({model: model});
$("div.cameras").prepend(view.render().el);
});
this.collection.on("remove", function(model) {
var ID = model.id;
$("#message-" + ID).parent("div.message").remove();
});
this.collection.on("reset", function(models) {
$("div.cameras").empty();
models.each(function(message) {
var view = new MessageView({model: message});
$("div.cameras").prepend(view.render().el);
});
});
},
filterMessages : function(filterString) {
var filtered = this.collection.filter(function(model){
if (filterString == "all")
{
return true;
}
else if (filterString == "active")
{
return model.get("ignore") == "0";
}
else if (filterString == "ignore")
{
return model.get("ignore") == "1";
}
else if (filterString == "flag")
{
return model.get("flag") == true;
}
});
this.collection.reset(filtered);
},