Backbone.JS如何处理具有计算属性的模型
我使用带有胡须的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