2012-02-14 113 views
6

我使用帶有鬍鬚的Backbone.JS,因此爲了呈現我稱之爲MyModel.toJSON()的我的tempaltes。這使我只能訪問屬性。我怎樣纔能有一些始終計算的屬性?Backbone.JS如何處理具有計算屬性的模型

我看着Backbone.JS文檔,它可能會覆蓋validate(),但這看起來像是一個黑客攻擊,並可能導致無限循環。

我也試過讓一個屬性是一個函數而不是一個值,但是當我嘗試使用它時,Mustache沒有得到一個值。

+0

重寫toJSON:讓它調用原始的toJSON,然後將計算的屬性添加到結果中。 – jdigital 2012-02-14 06:01:14

回答

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

你有沒有做不同的事情來阻止它創建一個無限循環?我試過這個,我可以創建一個模型,但是第一次在它上面設置任何東西時,我會得到一個無限循環。 – 2012-02-14 07:18:25

+0

哦!抱歉!我在'setCalculations'內忘記了',{silent:true}' – abraham 2012-02-14 13:12:41

0

我不知道如果我理解正確的問題,而是:

你不能通過實際的模型小鬍子嗎?所以例如當您渲染時

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

您正在將實際模型傳遞給模板。然後,你有一個模板

<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') 

我卻從未通過@ model.toJSON在我的模板,alawys實際的模型。

+0

這是行不通的,因爲Mustache(http://mustache.github.com/)是故意無邏輯的。您可以從對象中獲取屬性,但不能調用.get() – 2012-02-14 15:11:16