【问题标题】:Backbone.js saving model with attribute that is array of other modelsBackbone.js 保存模型,其属性是其他模型的数组
【发布时间】:2011-09-16 05:08:54
【问题描述】:

我正在编写第一个开源 Backbone.js 应用程序。 仓库在这里https://github.com/defrag/Backbone-Invoices

我在为 Invoice 保存 LineItems 数组时遇到问题。好吧,只在编辑后保存,因为它将当前编辑的发票中的行项目保存到本地存储中的所有发票中。不知道为什么会这样,他们总是有相同的 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]

我不明白的最后一件事是为什么主干不保存嵌套属性。正如您将在 repo 中看到的那样:

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 = "#"

事情是在编辑表单和更改行项目的值之后,它们在集合中没有变化。向发票行项目集合添加新功能。有什么帮助吗? :) 我很难理解一切是如何运作的 :)

您可以在这里查看:http://backbone-invoices.brillante.pl/

【问题讨论】:

    标签: javascript backbone.js coffeescript


    【解决方案1】:

    默认值是文字值,在定义时进行评估。这意味着您为每个 Invoice 实例分配了相同的 LineItem 实例给数组。

    解决方法很简单:使用函数返回数组。这样,您每次创建发票时都会获得一系列新的行项目:

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

    【讨论】:

    • 好答案。或者,将 @line_items = [new LineItem] 放入您的 initialize 方法中。
    • 我也会将您的LineItems 数组视为BackBone.Collection。它会消除很多你的创建代码(你可以只使用“add”代替)并且也会清理你的一些其他代码。
    • 谢谢大家,我设法解决了这个问题。原来保存模型的嵌套属性有点问题。我最终将 Collection 用于订单项并将所有内容解析为 JSON,然后再发送到 localStorage
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多