2012-02-14 20 views
6

私はMyustacheでBackbone.JSを使用していますので、テンポラリーをレンダリングするためにMyModel.toJSON()を呼び出します。これは私に属性へのアクセスのみを残します。常に計算されるいくつかの属性はどのように持つことができますか?計算された属性を持つモデルをBackbone.JSで処理する方法

私はBackbone.JSのドキュメントを見て、validate()をオーバーライドすることができますが、これはハックのようで無限ループにつながる可能性があります。

属性を値の代わりに関数にしようとしましたが、使用しようとするとMustacheは値を取得しません。

+0

toJSONをオーバーライド:元のtoJSONを呼び出してから、計算された属性を結果に追加します。 – jdigital

答えて

3

これは私が現在行っている方法です。私はモデルを初期化するときに計算を行い、リスナーを追加してモデルの変更を自動的に再計算します。

... 
initialize: function() { 
    console.log('Lead:initialize'); 
    _.bindAll(this, 'validate', 'calculate'); 
    this.bind('change', this.setCalculations, this); 
    this.setCalculations(); 
}, 
setCalculations: function() { 
    this.set({ calculations: this.calculate() }, { silent: true }); 
}, 
calculate: function() { 
    // do the calculations and return 
}, 
... 
+0

無限ループが発生しないように何か違うことをしましたか?私はこれを試してモデルを作成することができますが、最初に何かを設定すると無限ループになります。 –

+0

ああ!ごめんなさい!私は 'setCalculations'内の'、{silent:true} 'を忘れました – abraham

0

私は私が正しく質問を理解していれば知っているが、いけない:

あなたは口ひげする実際のモデルを渡すことができませんか?たとえば、レンダリングするときなど

render: ->  
rendered_content = @template({model: @model}) 
$(@.el).html rendered_content 
@ 

実際のモデルをテンプレートに渡しています。その後、私は実際に実際のモデルalawys、私のテンプレートでmodel.toJSON @渡すことはありませんテンプレート

<td class="quantity">   
    <input type="text" value="<%= model.get('quantity') %>" name="quantity" /> 
</td> 


<td> 
    <%= model.getTotalPrice() %> 
</td> 

とモデルにあなたが(getTotalPriceを宣言)

getTotalPrice: -> 
    total_price = @get('price') * @get('quantity') 
    total_price + total_price * @get('tax_rate') 

を持っています。

+0

Mustache(http://mustache.github.com/)は意図的にロジックがないので動作しません。オブジェクトから属性を取得できますが、.get()を呼び出すことはできません。 –

関連する問題