Как получить идентификатор модели при создании нового?

Используя 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;
 }