2011-10-04 91 views
1

如果我使用嵌套集合/模型綁定骨幹模型,請通過websockets將其發送到其他骨幹客戶端和JSON.parse模式model = JSON.parse(model)變量模型的工作方式與其他客戶端上的一樣嗎?運輸backbone.js模型?

回答

7

也許我會闡述。當我這樣做:

var o = JSON.parse(JSON.stringify(model)); 

我結束了一個簡單的對象o。爲什麼?那麼,首先,JSON.parse()不知道任何關於非基元類型(其中Array和Object被視爲原始類型),特別是它不知道Backbone模型是什麼,所以它不能重建它。此外,JSON.stringify將在其參數(如果有的話)和Backbone supplies a toJSON上調用toJSON方法,該方法僅將模型屬性的副本作爲簡單(可能是嵌套的)對象返回。所以一旦你有從JSON.stringify(model)的輸出,字符串和模型之間根本沒有連接,你只需要一個普通的舊的序列化的JavaScript對象。

如果您想將Backbone模型從一個系統移動到另一個系統,我認爲您必須自己跟蹤所有模型類型和對象信息,然後在另一側手動重建您的序列化對象圖片。

將模型保存回其URL,向另一個Backbone客戶端發送ID,然後像往常一樣從模型URL中重新加載它可能會更好。 JSON用於序列化數據,而不是對象,因爲對象留給應用程序解釋數據。

+0

感謝您的好評。我正在通過websockets完成所有這些工作,所以我可能會設計一種方法來從原始數據重建狀態。 – fancy

+0

@Lochlan:問題是關於將模型實例從一個地方複製到另一個地方。在一個地方,你將不得不'JSON.stringify(模型)'得到一個你可以發送到別處的字符串(JSON格式)。然後,在某個地方(或某個時間),您將用'JSON.parse'解壓該字符串。 –

2

我知道backbone爲每個對象維護一個內部id,所以如果你像他們那樣轉移他們,我不知道如果沒有衝突或重複cid的可能性,它是如何工作的。

從骨幹網的網站:

的模型一個特殊性質,在CID或客戶端ID是自動分配到所有型號的唯一標識符 時,他們首先創建 。當模型尚未保存到服務器的 ,並且還沒有其最終的真實ID時,客戶端ID很方便,但在UI中必須已經顯示 。客戶ID的格式爲:C1,C2,C3 ...

編輯:

閱讀'畝太短的回答我對他的回答後達成一致,但一些交代給他加評論他留在下面,我發現非常豐富。由於backbone.js模型具有toJSON()函數,因此當調用JSON.stringify(model)時,它不會解析所有屬性,就像您期望的那樣,它只解析toJSON()方法返回的對象。 '畝太短'的優秀答案。

MDN信息JSON.stringify():https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify

+0

但'cid'沒有出現在'JSON.stringify()'輸出中,Backbone的'toJSON()'只返回模型的屬性。所以你必須手工完成所有的序列化操作,然後在另一側清理模型類型和對象標識符以重建圖形。試着用你的一個Backbone模型做一個'console.log(JSON.parse(JSON.stringify(model)))',你會看到會發生什麼。 –

+0

@ muistooshort很好的答案,並感謝JSON.stringify()信息。 –