Как Backbone.JS обрабатывает модели с вычисленными атрибутами - PullRequest
6 голосов
/ 14 февраля 2012

Я использую Backbone.JS с усами, поэтому для рендеринга своих шаблонов я вызываю MyModel.toJSON (). Это оставляет мне только доступ к атрибутам. Как я могу иметь некоторые атрибуты, которые всегда рассчитываются?

Я посмотрел документацию Backbone.JS, и она могла бы работать, чтобы переопределить validate (), но это похоже на взлом и может привести к бесконечным циклам.

Я также пытался сделать атрибут функцией, а не значением, но усы не получают значение, когда я пытаюсь его использовать.

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Вот как я сейчас это делаю. Я выполняю расчеты при инициализации модели и добавлении прослушивателя изменений в модели для автоматического пересчета.

...
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 голосов
/ 14 февраля 2012

Я не знаю, правильно ли я понимаю вопрос, но:

Не можете ли вы передать фактическую модель усам?например, при рендеринге

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 в своих шаблонах, а фактически используем модель.

...