Как обновить модель в коллекции?
У меня есть следующая коллекция Backbone.js:
var Tags = Backbone.Collection.extend({
url: "/api/v1/tags/"
}),
Как обновить одну из моделей в коллекции, чтобы она помещалась в /api/v 1/tags/id и сохраняла данные для этой модели.
Итак, если я изменю имя модели с id 2 в коллекции
Он должен
/api/v 1/tags/2 со следующими данными:
имя: новое имя id: 2
Ответы
Ответ 1
Недавно я также хотел обновить определенную модель в коллекции. Проблема заключалась в том, что если бы я использовал только model.save
, он не обновлял коллекцию. Цель состояла в том, чтобы изменить модель в коллекции, изменить ее на сервере, обновить коллекцию и не использовать метод sync
. Так, например, у меня есть переменная collection
, и я хочу изменить модель с помощью id = 2
.
Итак, во-первых, я создам модель экземпляра, например:
var model = collection.get(2)
Затем я обновлю атрибуты на этой конкретной модели: < br/" > model.set({name: 'new name'})
Затем я сохраню его на сервере:
model.save({}, {url:'/api/v1/tags/'+model.get('id')})
Затем мы должны обновить коллекцию в соответствии с изменениями: < br/" > collection.set({model},{remove: false})
set
метод - это "умное" обновление коллекции со списком моделей, которые вы передавали в параметрах.
remove: false
параметр - это ограничение для коллекции для удаления существующих моделей в коллекции. Подробнее здесь.
Ответ 2
Первое, что вы можете пропустить, это то, что в вашей соответствующей модели Tag вам нужно будет установить "urlRoot" в соответствие с "url" коллекции. В противном случае он вообще не знает о коллекции:
var Tag = Backbone.Model.extend({
urlRoot: "/api/v1/tags"
});
var Tags = Backbone.Collection.Extend({
model: Tag,
url: "/api/v1/tags"
});
Это полезно, если вы хотите сохранить тег отдельно:
var tag = collection.get(2);
tag.set({key: "something"});
tag.save(); // model.save works because you set "urlRoot"
В коллекции "create()" также является "update()", если id не равен null. Это не смущает.:) Поэтому это в значительной степени эквивалентно предыдущему образцу:
collection.create({id: 2; key: "something"});
Это приведет к обновлению существующего тега с id = 2, а затем вызовет PUT.
Это древний вопрос; отвечая, потому что я искал тот же ответ - вы, наверное, давно решили эту проблему и двинулись дальше.:)
Ответ 3
Вы можете передать переменные методу save
. Он принимает все параметры, которые использует метод jQuery ajax
(если вы не переопределили Backbone.Sync
)
Вы можете сделать что-то вроде:
model.save( { name:'new name' } )
;
Метод id
и PUT
будет автоматически добавлен Backbone для вас.