2013-03-29 32 views
3

我有以下的骨幹模型創建與嵌套對象和更新骨幹模型複雜的形式JSON表示

var Page = Backbone.Model.extend({ 
    defaults: { 
     id: null, 
     metadata: { 
      name: '', 
      title: '', 
      ... 
     }, 
     children: [] 
     parent: null 
    }, 
    urlRoot: '/api/page', 
    initialize: function() {} 
}); 

當我保存下列形式,我需要創建這種形式的JSON表示和更新骨幹模型然後將其保存到服務器。我需要這樣做,因爲我的表單是動態創建的,所以我無法使用硬編碼選擇器來查找表單名稱。以下是一個示例表單。

<form> 
    <label>Name:</label> 
    <input type="text" name="metadata.name" value=""> 
    <label>Title:</label> 
    <input type="text" name="metadata.title" value=""> 
    <label>Slug:</label> 
    <input type="text" name="metadata.slug" value=""> 
    <label>Url:</label> 
    <input type="text" name="metadata.url" value=""> 
    <button type="submit">Save</button> 
</form> 

基於HTML表單數據更新骨幹模型的最有效方法是什麼?

編輯

我發現this answer here at stackoverflow,使用方括號,而不是對象之間的點。我認爲這種技術工作得很好,但也許有類似的方式來使用點符號序列化表單?

+0

您是否嘗試序列化的形式作爲一個整體?例如'var form = $('form')[0]; var data = JSON.stringify(form.serializeArray());' –

+0

@ DennisRongo是的,結果與我的骨幹模型不匹配,結果如下所示:[{「name」:「metadata.name」,「value 「:」lorem「},{」name「:」metadata.title「,」value「:」我的標題「},{」name「:」metadata.description「,」value「:」「},{」name 「:」 metadata.slug 「 」值「: 」foo「 的},{ 」名稱「: 」metadata.url「, 」值「: 」foo「 的},{ 」名稱「: 」metadata.published「,」 值「:」0001-01-01T00:00:00「}] – Marcus

+0

當你說'動態表單'時,你的意思是你的字段名稱每次都改變嗎?什麼是動態的呢?你甚至可以爲動態元素做一個選擇器。 –

回答

2

我結束了使用this整潔的小庫我的形式轉換爲JavaScript對象

-1

有一個想法你有什麼想法,我只是刪除Model的默認值,並留下的字段永遠存在(或刪除它的時間)。這些字段在這一點上是未知的,因此在您的情況下設置默認值並不理想。從技術上講,Model可以更新到任何你想要它的字段,並將適應你從服務器提供的任何字段。

最關鍵的階段是最初設置Model,因爲這決定了Model中包含的屬性。由於您提到表單是動態創建的,因此您可以通過JSON對象創建Model,該對象表示與您要呈現的表單一起使用的數據。

當需要將其保存回服務器時,您的Model將具有執行更新所需的所有屬性。這是第一種方式。

model.save(); 

或者你也可以序列化Form當它的時間來保存更改一個整體。基本上,在運行時創建一個新的Model

var form= $('#myForm'); 
var data = JSON.stringify(form.serializeArray()); 

/**Create a new instance of the Model then and perform an update. */ 
var model = new MyModel(data); 
model.save();