2011-08-25 43 views
11

使用Backbone.JS,我能夠成功創建新模型並將其保存到服務器。他們成功地進行ajax調用,並且訂閱的UI元素更新得當。然後我碰到的問題是,我不知道新創建的對象的ID。如何在創建新的時候檢索模型ID?

我可以在我的創建調用的響應標題中看到,服務器正在返回一個位置標題,如:Location https://localhost/rest/beta/mobile/footer/OTo3Njow,最後一個參數是新創建的標識。

如何在不覆蓋backbone.sync的情況下獲得此ID?如果我必須重寫backbone.sync,那麼最乾淨的方法是什麼?

UPDATE 它看起來像我的組織使用的是舊Backbone.js的,其中的模型解析方法不提供給XHR對象的引用,否則我可以趕上ID和在那裏做了分配。

回答

10

服務器應發回包含模型的id的JSON對象,以及它想要更新的任何其他屬性。如果確實如此,Backbone將自動獲取該ID。

如果這不是一個選項,您應該重寫Backbone.sync,因爲那麼您的API(它在位置標頭而不是響應主體中傳遞新標識)不符合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(){ 
      // … 
     }); 
    } 
}); 
1

我解決了這個由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); 
} 

超載成功PARAM並通過添加新的方法到我的基地模式「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; 
} 
+2

使用'this.set('id',...)'。當模型的id發生變化時,其他事情需要發生 - id在模型的屬性對象中更新,如果模型位於集合中,則需要通知集合有ID,等等。 – s4y

+0

非常好的捕獲。謝謝。 –

相關問題