#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() без передачи каких-либо моделей в качестве аргументов приведет к опустошению всей коллекции.