2011-09-14 161 views
1

即時編寫第一個開源Backbone.js應用程序。 存儲庫在這裏https://github.com/defrag/Backbone-InvoicesBackbone.js保存模型的屬性,其他模型的數組

我有保存發票的LineItems數組的問題。那麼,僅在編輯後保存,因爲它將訂單項從當前編輯的發票保存到localstorage中的所有發票。不知道爲什麼會發生這種情況,他們總是有相同的Cids。 創建發票時的默認訂單項始終爲cid0。任何幫助?

class window.Invoice extends Backbone.Model 

    initialize: -> 

    defaults: 
    date: new Date 
    number: '000001' 
    seller_info: null 
    buyer_info: null 
    line_items: [new LineItem] 

的最後一件事,我不明白的是爲什麼骨幹心不是保存嵌套的屬性。正如你將在回購中看到我做的:

handleSubmit: (e) ->   
data = { 
    date : @$("input[name='date']").val(), 
    number : @$("input[name='number']").val(), 
    buyer_info : @$("textarea[name='buyer_info']").val(), 
    seller_info : @$("textarea[name='seller_info']").val(), 
    line_items: @model.line_items.toJSON() 
}  

if @model.isNew() 
    invoices.create(data) 
else 
    @model.save(data) 

e.preventDefault() 
e.stopPropagation()  
$(@el).fadeOut 'fast', -> 
    window.location.hash = "#" 

事情是在編輯表單和更改行項目的值後,它們不會在集合中更改。添加新的發票訂單項集合作品。任何幫助? :)我有一些很難與理解everyhing是如何工作的:)

您可以點擊此處查看:http://backbone-invoices.brillante.pl/

回答

8

默認值是文字值,在定義的時間進行評估。這意味着對於每個Invoice實例,您都將相同的LineItem實例分配給該數組。

對此的修復很簡單:使用函數返回數組。這樣,您每次創建發票時都會獲得一組新訂單項:

window.Invoice = Backbone.Model.extend({ 
    defaults: { 
    date: function(){ return new Date(); }, 
    line_items: function(){ return [new LineItem()]; }, 
    other: "stuff" 
    } 
}); 
+2

很好的答案。或者,把'@line_items = [new LineItem]'放在'initialize'方法中。 –

+0

我也會考慮你的'LineItem'數組是'BackBone.Collection'。它會消除很多你的創建代碼(你可以使用「add」代替),並且會清理你的其他代碼。 –

+0

謝謝你們,我設法解決這個問題。事實證明,保存模型的嵌套屬性是一個小問題。我最終使用Collection來處理訂單項,並在發送到localStorage之前將所有內容解析爲JSON – Michal