问题 如何在创建新模型时检索模型ID?


使用Backbone.JS,我能够成功创建新模型并将其保存到服务器。他们成功地进行了ajax调用,并且订阅的UI元素进行了适当的更新。我遇到的问题是我不知道新创建的对象的ID。

我可以在创建调用的响应头中看到,服务器返回的位置标头如下: Location https://localhost/rest/beta/mobile/footer/OTo3Njow 最后一个参数是新创建的ID。

如何在不覆盖backbone.sync的情况下获取此ID?如果我必须覆盖backbone.sync,最干净的方法是什么?

UPDATE 看起来我的组织正在使用较旧的Backbone.js,其中模型的解析方法不提供对XHR对象的引用,否则我可以捕获ID并在那里进行分配。


3656
2017-08-25 12:45


起源



答案:


服务器应该发回一个包含的JSON对象 id 模型,以及它想要更新的任何其他属性。如果是这样,Backbone将自动获取id。

如果那不是一个选项,你应该覆盖 Backbone.sync,因为那时你的API(它在位置头而不是响应体中传递新的id)不符合Backbone支持的开箱即用。


如果服务器已经执行此操作,并且您只想获取ID,则取决于谁需要知道。如果是代码调用 model.save(),那么它可以传递成功的回调:

model.save({}, {
    success: function(){
        // do something with model.id
    }
});

如果模型本身需要在获取id时得到通知,则可以使用初始化程序:

var MyModel = Backbone.Model.extend({
    initialize: function(){
        this.bind("change:id", function(){
            // …
        });
    }
});

10
2017-08-25 13:45





我通过在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;
 }

1
2017-08-25 13:31



使用 this.set('id', …)。当模型的id发生变化时,需要进行其他事情 - 在模型的属性对象中更新id,如果模型在集合中,则需要通知集合它具有id等。 - s4y
非常好的捕获。谢谢。 - Skylar Anderson


答案:


服务器应该发回一个包含的JSON对象 id 模型,以及它想要更新的任何其他属性。如果是这样,Backbone将自动获取id。

如果那不是一个选项,你应该覆盖 Backbone.sync,因为那时你的API(它在位置头而不是响应体中传递新的id)不符合Backbone支持的开箱即用。


如果服务器已经执行此操作,并且您只想获取ID,则取决于谁需要知道。如果是代码调用 model.save(),那么它可以传递成功的回调:

model.save({}, {
    success: function(){
        // do something with model.id
    }
});

如果模型本身需要在获取id时得到通知,则可以使用初始化程序:

var MyModel = Backbone.Model.extend({
    initialize: function(){
        this.bind("change:id", function(){
            // …
        });
    }
});

10
2017-08-25 13:45





我通过在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;
 }

1
2017-08-25 13:31



使用 this.set('id', …)。当模型的id发生变化时,需要进行其他事情 - 在模型的属性对象中更新id,如果模型在集合中,则需要通知集合它具有id等。 - s4y
非常好的捕获。谢谢。 - Skylar Anderson


http://documentcloud.github.com/backbone/#Model-id

model.id属性?


0
2017-08-25 12:50



这确实是在从model.fetch()返回的元素上设置的,但它没有在myNewModel.save()上设置 - Skylar Anderson