Как получить идентификатор модели при создании нового?
Используя Backbone.JS, я могу успешно создавать новые модели и сохранять их на сервере. Они успешно выполняют вызов ajax и соответствующим образом обновляют элементы подписного интерфейса. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю идентификатора вновь созданного объекта.
Я могу видеть в заголовках ответов для своих вызовов создания, что сервер возвращает заголовок местоположения, например: Location https://localhost/rest/beta/mobile/footer/OTo3Njow
, причем последний параметр является вновь созданным идентификатором.
Как я могу получить этот идентификатор без переопределения backbone.sync? Если мне нужно переопределить backbone.sync, какой самый чистый метод?
UPDATE
Похоже, что моя организация использует более старую Backbone.js, в которой метод разбора моделей не предоставляет ссылку на объект XHR, иначе я мог бы поймать идентификатор и назначить там.
Ответы
Ответ 1
Сервер должен отправить обратно объект JSON, содержащий id
модели, а также любые другие атрибуты, которые он хочет обновить. Если это так, Backbone автоматически захватит идентификатор.
Если это не вариант, вы должны переопределить Backbone.sync
, потому что тогда ваш API (который связывает новый идентификатор в заголовке местоположения вместо тела ответа) не соответствует тому, что поддерживает базовая поддержка из коробки.
Если сервер уже делает это, и вы просто хотите получить идентификатор, это зависит от того, кто должен знать. Если его код вызывает model.save()
, то он может передать успешный обратный вызов:
model.save({}, {
success: function(){
// do something with model.id
}
});
Если сама модель должна быть уведомлена, когда она получает идентификатор, вы можете использовать инициализатор:
var MyModel = Backbone.Model.extend({
initialize: function(){
this.bind("change:id", function(){
// …
});
}
});
Ответ 2
Я решил это, перегрузив параметр успеха в backbone.sync
// Return XHR on success
params.success = function(response, text, XHR) {
if(_.isFunction(model.xhrParse)) { model.xhrParse.call(model, response, XHR); }
success.call(model, response);
}
и добавив новый метод к моей базовой модели "xhrParse":
xhrParse: function(resp, XHR) {
var locationHeader = XHR.getResponseHeader('Location');
if(locationHeader && !this.id) {
var xplode = locationHeader.split("/");
this.id = xplode[xplode.length - 1];
}
return resp;
}
Ответ 3
http://documentcloud.github.com/backbone/#Model-id
Свойство model.id?