我使用帶有鬍鬚的Backbone.JS,因此爲了呈現我稱之爲MyModel.toJSON()的我的tempaltes。這使我只能訪問屬性。我怎樣纔能有一些始終計算的屬性?Backbone.JS如何處理具有計算屬性的模型
我看着Backbone.JS文檔,它可能會覆蓋validate(),但這看起來像是一個黑客攻擊,並可能導致無限循環。
我也試過讓一個屬性是一個函數而不是一個值,但是當我嘗試使用它時,Mustache沒有得到一個值。
我使用帶有鬍鬚的Backbone.JS,因此爲了呈現我稱之爲MyModel.toJSON()的我的tempaltes。這使我只能訪問屬性。我怎樣纔能有一些始終計算的屬性?Backbone.JS如何處理具有計算屬性的模型
我看着Backbone.JS文檔,它可能會覆蓋validate(),但這看起來像是一個黑客攻擊,並可能導致無限循環。
我也試過讓一個屬性是一個函數而不是一個值,但是當我嘗試使用它時,Mustache沒有得到一個值。
這就是我目前的做法。我在初始化模型時執行計算,併爲模型的更改添加偵聽器以自動重新計算。
...
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
},
...
你有沒有做不同的事情來阻止它創建一個無限循環?我試過這個,我可以創建一個模型,但是第一次在它上面設置任何東西時,我會得到一個無限循環。 – 2012-02-14 07:18:25
哦!抱歉!我在'setCalculations'內忘記了',{silent:true}' – abraham 2012-02-14 13:12:41
我不知道如果我理解正確的問題,而是:
你不能通過實際的模型小鬍子嗎?所以例如當您渲染時
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實際的模型。
這是行不通的,因爲Mustache(http://mustache.github.com/)是故意無邏輯的。您可以從對象中獲取屬性,但不能調用.get() – 2012-02-14 15:11:16
重寫toJSON:讓它調用原始的toJSON,然後將計算的屬性添加到結果中。 – jdigital 2012-02-14 06:01:14