Уничтожение базовой модели в коллекции за один шаг?

#collections #model #backbone.js

#Коллекции #Модель #backbone.js

Вопрос:

Являются ли эти два шага обязательными для удаления модели?

 var model = collection.get(id);
model.destroy();
collection.remove(model);
  

Есть ли способ уничтожить модель, когда она удаляется из своей коллекции?

Комментарии:

1. Я не уверен, какую версию Backbone вы использовали, когда задавали этот вопрос, но AFAIK, по крайней мере, в версии 0.5.3, когда вы вызываете .destroy() свою модель, Backbone удаляет ее с сервера и (при условии, что это удалось) затем автоматически удаляет ее из своей коллекции.

2. Неплохо. Я использовал версию 0.3.3

3. Примечание для будущих читателей: backbone удалит ее из всех коллекций, а не только из model.collection. Коллекции прослушивают события модели, и ‘destroy’ вызывает удаление (с соответствующими событиями).

Ответ №1:

 Model.bind("remove", function() {
  this.destroy();
});
...
var model = new Model();
...
collection.remove(model);
  

Удаление модели из коллекции запускает "remove" событие.

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

Комментарии:

1. Спасибо за это, однако это довольно неинтуитивно, IMO. Есть ли какая-либо причина, по которой вы НЕ хотели бы, чтобы модель уничтожалась при вызове remove в коллекции (по крайней мере, достаточная причина для того, чтобы это не было поведением по умолчанию). Стоит ли это поднимать в качестве запроса функции на github?

2. Коллекции @kissmyface — это произвольные (как в терминах базы данных) представления моделей. Если я решу, что вы не должны видеть модель X в поле зрения (коллекция) Y почему модель X должна быть уничтожена?

3. Это хорошая аналогия. Я не осознавал, что они были настолько разобщены (весь мой код до сих пор имел довольно жесткие связи между коллекциями и моделями). Спасибо за разъяснение.

4. @kissmyface однако это не означает, что у нас не должно быть sugar, подобного have с .create у нас мог бы быть .destroy , который уничтожает и удаляет модель в коллекции

5. Это именно то, что я сделал. Я создал метод destroy на своем контроллере (принимает идентификатор в качестве параметра). Внутри я уничтожаю модель, а затем удаляю ее из коллекции — это отлично работает.

Ответ №2:

Вызов collection.reset() без передачи каких-либо моделей в качестве аргументов приведет к опустошению всей коллекции.

http://backbonejs.org/#Collection-reset