2011-09-14 11 views
1

最初のオープンソースのBackbone.jsアプリケーションを作成しています。 レポジトリはこちらhttps://github.com/defrag/Backbone-Invoices他のモデルの配列である属性を持つBackbone.jsモデルを保存

インボイスのLineItemの配列を保存する際に問題があります。つまり、現在編集されている請求書の明細を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

ありがとう、私はこれを把握することができます。モデルであったネストされた属性を保存することで少し問題になりました。最終的に広告申込情報のコレクションを使用し、JSONにすべてを解析してからlocalStorageに送信しました – Michal

関連する問題