Backbone.js: лучший способ очистить все представления - PullRequest
1 голос
/ 17 сентября 2011

Я использую Backbone.js для отображения списка элементов (получателей электронной почты), которые имеют другой статус, например.подтверждено, в ожидании и так далее.После того, как список обработан, у пользователя есть возможность отфильтровать их, чтобы пользователь мог перечислить всех получателей или только подтвержденных получателей и т. Д.Элементы (получатели) естественным образом хранятся в коллекции.

Мой подход заключается в том, чтобы использовать событие фильтра:

  1. Очистить все представления элемента *
  2. из приложенияview вызывает функцию filterOnStatus в коллекции, которая возвращает все модели и добавляет их в представление.

Шаг 2 работает нормально.Но как лучше всего очистить все элементы в представлении коллекции.

В примере приложения Todo (http://documentcloud.github.com/backbone/examples/todos/index.html) они делают нечто подобное. В представлении приложения следующий код используется для очистки всех завершенныхэлементы из списка.

clearCompleted: function() {
  _.each(Todos.done(), function(todo){ todo.destroy(); });
  return false;
},

Разница в том, что они делают это, удаляя фактическую модель. И представление этой модели прослушивает событие уничтожения, которое удаляет представление.

Iхотите сохранить модель.

Каков наилучший способ решить эту проблему. Нужно ли в моделях сохранять ссылку на ее виды, а затем перебирать модели и удалять виды?

Есть ли лучший подход, если я хочу фильтровать атрибуты в моделях?

1 Ответ

0 голосов
/ 17 сентября 2011

Если ваш первый шаг - это просто очистка всех элементов, то почему бы вам не добавить в AppView простой метод, который будет делать именно это, например: clearList: function() { this.$('.list').html('') }.

Или, что еще лучше, вы можете отфильтровать все модели и отобразить их во временном элементе, а затем заменить им текущий список.Таким образом, вся фильтрация будет выполняться только за один вызов DOM (DOM работает медленно).Пример с jQuery:

AppView.filterOnStatus = function() {
    var $fragment = $('<div/>')

    // filter your collection and append rendered views to $fragment

    this.$('.list').html( $fragment.html() )
}

Конечно, есть более сложные способы, но необходимость в них зависит от того, чего вы пытаетесь достичь.Из того, что я понял, этот простой подход вполне подойдет.

...