2012-02-14 9 views
6

Sto utilizzando Backbone.JS con Moustache, quindi per eseguire il rendering dei miei tempolli chiamo MyModel.toJSON(). Questo mi lascia solo l'accesso agli attributi. Come posso avere alcuni attributi che vengono sempre calcolati?In che modo Backbone.JS gestisce i modelli con attributi calcolati

Ho esaminato la documentazione di Backbone.JS e potrebbe funzionare per eseguire l'override di validate(), ma questo sembra un hack e può portare a cicli infiniti.

Ho anche provato a fare in modo che un attributo sia una funzione anziché un valore, ma il baffo non ottiene un valore quando provo ad usarlo.

+0

Ignora toJSON: chiamarlo originale toJSON, quindi aggiungere gli attributi calcolati al risultato. – jdigital

risposta

3

Ecco come lo sto attualmente facendo. Eseguo i calcoli durante l'inizializzazione di un modello e aggiungo un listener per le modifiche al modello da ricalcolare automaticamente.

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

Hai fatto qualcosa di diverso per impedirgli di creare un ciclo infinito? Ho provato questo e posso creare un modello, ma poi la prima volta che imposto qualcosa su di esso ottengo un ciclo infinito. –

+0

Oh! Scusate! Ho dimenticato il ', {silent: true}' all'interno di 'setCalculations' – abraham

0

Non so se ho capito correttamente alla domanda, ma:

non puoi passare il modello reale di baffi? per esempio quando rendi

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

Stai passando il modello attuale al modello. Allora avete un modello di

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


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

E nel modello si dichiara getTotalPrice()

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

Io in realtà mai passare @ model.toJSON nei miei modelli, alawys il modello attuale.

+0

Questo non funziona perché Moustache (http://mustache.github.com/) è intenzionalmente privo di logica. È possibile ottenere attributi dall'oggetto ma non è possibile chiamare .get() –