Мне может не хватить информации, чтобы ответить на этот вопрос на основании вашего вопроса, поэтому я предполагаю, что у вас есть представление, которому был предоставлен экземпляр коллекции. Кроме того, я предполагаю, что ваш POST публикует атрибуты модели, но сразу возвращает атрибуты модели, включая ее недавно назначенный идентификатор.
Итак, что вы хотите сделать, это:
- Привязать представление к событию DOM для всего, что инициирует сохранение человеком.
- Привязать представление к событиям добавления (и / или удаления) экземпляра коллекции.
- В вашем обработчике событий Person сохраните атрибуты Person и инициализируйте с ними новую модель Person; затем сохраните его. В обратном вызове успеха добавьте полученную модель, у которой теперь есть идентификатор, в коллекцию.
- В обработчике добавления событий повторно отредактируйте представление соответствующим образом.
Вот код:
PeopleView = Backbone.View.extend({
events: {
"submit form#person-form" : "onSave",
"click .remove-person" : "onRemovePerson",
},
// Presumes you've handed the view a people collection and
// named it 'collection' to enable backbone.js to auto set it
// into the view's state.
initialize: function(options) {
_.bindAll(this, "onPersonAdded");
this.collection.bind("add", this.onPersonAdded);
this.collection.bind("remove", this.onPersonRemoved);
},
onSave: function(e) {
var self = this;
var person = new Person();
var person_attrs = this.serialize(); // harvest from your form in this method.
person.save(person_attrs, {
success: function(saved_person, data) {
self.collection.add(saved_person);
},
error: function(aborted_person, response) {
// Error handling as needed.
}
});
},
onRemovePerson: function(e) {
e.preventDefault();
var cid = $(e.target).attr('id');
var person = this.collection.getByCid(cid);
person.destroy({
success: function(removed_person, data) {
self.collection.remove(removed_person);
},
error: function(aborted_person, response) {
// Error handling as needed.
}
});
},
onPersonAdded: function(added_person) {
// perform rendering as needed here.
},
onPersonRemoved: function(removed_person) {
// perform rendering as needed here.
}
});
В качестве стилистического примечания вы можете не захотеть обрабатывать код сохранения модели в представлении. В качестве альтернативы вы можете обратиться к контроллеру или другому подходящему объекту.