2011-09-14 215 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