2012-02-14 12 views
6

Estoy usando Backbone.JS con Moustache, por lo que para renderizar mis tempaltes llamo MyModel.toJSON(). Esto me deja solo acceso a los atributos. ¿Cómo puedo tener algunos atributos que siempre se calculan?¿Cómo maneja Backbone.JS los modelos con atributos calculados?

Miré la documentación Backbone.JS y podría funcionar para anular validate() pero esto parece un truco y puede conducir a bucles infinitos.

También intenté hacer que un atributo sea una función en lugar de un valor, pero Moustache no obtiene ningún valor cuando intento usarlo.

+0

Anular toJSON: haga que llame al original en JSON, luego agregue sus atributos calculados al resultado. – jdigital

Respuesta

3

Así es como lo estoy haciendo actualmente. Hago los cálculos al inicializar un modelo, y agregar un oyente para los cambios en el modelo para volver a calcular automáticamente.

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

¿Hizo algo diferente para evitar que se cree un ciclo infinito? Intenté esto y puedo crear un modelo, pero luego, la primera vez que configuro algo, obtengo un ciclo infinito. –

+0

¡Oh! ¡Lo siento! Olvidé el ', {silent: true}' dentro de 'setCalculations' – abraham

0

No sé si he entendido bien la pregunta, pero:

no puede usted pasar el modelo real de bigote? por ejemplo, cuando representa

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

Usted está pasando el modelo real a la plantilla. Entonces usted tiene una plantilla

<td class="quantity">   
    <input type="text" value="<%= model.get('quantity') %>" name="quantity" /> 
</td> 


<td> 
    <%= model.getTotalPrice() %> 
</td> 

Y en el modelo se declara getTotalPrice()

getTotalPrice: -> 
    total_price = @get('price') * @get('quantity') 
    total_price + total_price * @get('tax_rate') 

realidad nunca paso @ model.toJSON en mis plantillas, alawys el modelo real.

+0

Eso no funciona porque Moustache (http://mustache.github.com/) es intencionalmente sin lógica. Puedes obtener atributos del objeto pero no puedes llamar a .get() –

Cuestiones relacionadas