Backbone.JS如何处理具有计算属性的模型

问题描述:

我使用带有胡须的Backbone.JS,因此为了呈现我称之为MyModel.toJSON()的我的tempaltes。这使我只能访问属性。我怎样才能有一些始终计算的属性?Backbone.JS如何处理具有计算属性的模型

我看着Backbone.JS文档,它可能会覆盖validate(),但这看起来像是一个黑客攻击,并可能导致无限循环。

我也试过让一个属性是一个函数而不是一个值,但是当我尝试使用它时,Mustache没有得到一个值。

+0

重写toJSON:让它调用原始的toJSON,然后将计算的属性添加到结果中。 – jdigital 2012-02-14 06:01:14

这就是我目前的做法。我在初始化模型时执行计算,并为模型的更改添加侦听器以自动重新计算。

... 
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

我不知道如果我理解正确的问题,而是:

你不能通过实际的模型小胡子吗?所以例如当您渲染时

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