2012-05-08 72 views
9

我一直在嘗試backbone.js,並且在創建一個新的模型對象時被阻塞,然後調用model.save()。我期望backbone.js的默認行爲是用數據庫中的id更新模型對象,但事實並非如此。這不應該發生?我已經驗證了我正在獲取具有json格式屬性的帖子。我的服務器將json保存到一個表中,然後將具有新id字段的json返回給backbone.js。它是否正確?我的服務器應該返回整個新對象還是僅返回id或什麼?backbone.js保存後沒有更新模型對象的id,爲什麼不呢?

//contents of the POST from backbone.js 
    { "text":"this is a test" } 

//reply from my server 
    { id:"15", text:"this is a test" } 

我的示例代碼低於

var SQLRow = Backbone.Model.extend({ 
table:"", 
urlRoot:'db', 
url:function() { 
    return "/" + this.urlRoot + "?table=" + this.table + 
       "&id=" + this.attributes.id; 
    } 
}); 

var Xtra = SQLRow.extend ({ 
    table:'Xtra' 
}); 

var row = new Xtra({ 
    text: "this is a test" 
}); 

alert(row.url()); 
row.save() 
alert("row:" + row.get("id")); 
+0

響應看起來像從保存呼叫中返回的結果是什麼? – kinakuta

回答

6

艱難的從您的文章告訴。兩個想法:

1)服務器的響應不成功你的保存調用返回什麼?

2)您的「id」屬性被命名爲ID以外的其他名稱。爲了考慮不同的名稱添加以下模型:

idAttribute : "MyModelsID", 

編輯

你很可能會面臨一個時間問題,其中ID之前的警報觸發的恢復。而不是你的最後兩行的嘗試:

row.save(null, 
       { 
       success : function(model, response) { alert(model.get('id'); } 
       } 
     ); 

備選

正如@mu_is_too_short提到的,另一種方式是監聽的變化,甚至在模型上,並響應該事件。 (我只是儘量保持答案儘可能接近你的代碼)。但是,類似下面僞代碼應該讓你開始...

var myView = Backbone.View.extend({ 
      .... 
      initialize : function() { 
       this.collection.bind('change', this.SOME_LISTENING_FUNC ); 

      } 
    }); 

,或者,如果你在收集/視圖少的世界是這樣的創建listenr是......

row.on('change', function() { /* do stuff */ }, this);    
+1

或者將''change''處理程序綁定到模型,並以這種方式獲取'save'的結果。 Backbone是一個事件驅動的框架,試圖將它串聯成一個串行模型並不能很好地工作(這部分主要是針對Cjolly)。 –

+0

@ muistooshort - 所以我們再見面moo。感謝您的選擇,我將一些僞代碼合併到答案中。 – EBarr

+3

代碼有兩個問題。首先由服務器返回的json格式還需要引用屬性的鍵(即。{id:「ax」}真的應該是{「id」:「ax」}。 ,保存後我的警報很可能永遠不會顯示對象的真實性質,因爲save是異步的ajax調用,並且在ajax和backbone.js處理完成之前,我們總是會獲得警報。 mu是簡短**以上建議是正確的方式去: – Cjolly

1

此答案是根據Cjolly在上面的答案中的一條評論。

這是爲了使Backbone.Model.save([attributes],[options])成功assiging從服務器新生成的模型ID的模式,即服務器返回模型的id在一個JSON字符串這樣{ "id" : <the id> }至關重要。 (注意它是"id"而不是id)。

本質骨幹理所當然地需要一個JSON字符串,並在對比如何對象可能在Javascript中定義,而不引用鍵,JSON需要被引用對象鍵(見JSON Spec - does the key have to be surrounded with quotes?

因爲根據Cjolly的評論這一直是最基本的問題,我想在第二個答案中強調這個解決方案。部分原因是我受到同樣的問題的影響,只有通過閱讀通過評論我能夠得到的見解。

0

我遇到了同樣的問題,我發現我保存的模型的validate函數實際上使從後端返回的模型無效。這就是爲什麼我的領域沒有正確更新。

0

也許它有點過時了,但今天我有同樣的失蹤身份證。 事實證明,服務器只是發送包含新ID的重定向的Header'Location',但不能返回持久化對象。 將對象添加到響應是解決方案。 看來,沒有返回對象是與Roo(Spring)生成的Json控制器的標準行爲。

相關問題