I я настраиваю приложение, управляемое Backbone. Я столкнулся с проблемой «должно-быть-просто», когда у меня есть модель под названием «Message», коллекция под названием «MessageList» и представления под названием «MessageView " и "MessageListView".
Код MessageListView отображает MessageList. У меня есть 4 переключателя, которые фильтруют то, что показывает MessageListView. Кнопки фильтра: "Все", "Активно", "Помечено" и "Игнорируется". " Все» — это первоначальный фильтр при загрузке страницы. Когда пользователь нажимает фильтр «Помечено», должны отображаться только сообщения с флагом == 1. При повторном нажатии «Все» все сообщения должны отображаться снова.
Проблема, с которой я сталкиваюсь, и проблема в моем дизайне заключается в том, что когда я фильтрую Коллекцию на основе filterString, ссылка на исходную всю Коллекцию теряется Итак, когда «Все» снова нажимается n, Сообщения потеряны.
Мне интересно, как это лучше всего сделать в 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);
},