2011-10-11 14 views
8

Sto solo imparando la spina dorsale. Ho il seguenteOttenere la somma di una raccolta (tutti i modelli) con backbone.js

window.ServerList = Backbone.Collection.extend({ 

    model: Server, 

    cpuTotal: function(){ 
     if (!this.length) return 0; 
     /* 
     * NOT SURE HOW TO SUM THEM 
     * this.get('cpu') is an integer for each of the collections 
     */ 
     return this.get('cpu'); 
    } 

}); 

sto chiamando questo dal metodo rendering di una vista come questa

window.AppView = Backbone.View.extend({ 

    // .... 

    render: function(){ 
     var total_cpu = ServerList.cpuTotal(); 
     var items = ServerList.length; 

    } 
}); 

Il total_cpu variabile è sempre vuoto ma gli elementi è sempre corretto. Qualche idea ?

So che la mia raccolta funziona perché ho un sacco di elementi, ma ho bisogno di sommare tutte le CPU da ciascun elemento della raccolta per il riepilogo della pagina.

Per coloro che conoscono l'esempio di esempio http://documentcloud.github.com/backbone/docs/todos.html ho una configurazione molto simile.

risposta

18

Qui è il modo migliore che conosco:

cpuTotal: function() { 
    return this.reduce(function(memo, value) { return memo + value.get("cpu") }, 0); 
} 

Ecco un jsFiddle of the solution.

+1

+1 per il violino, e per coloro che sono interessati nella documentazione: http: //documentcloud.github. com/sottolineatura/# ridurre –

4

Credo che il tuo problema è che "questo" può o non può fare riferimento all'istanza della tua raccolta, a seconda che tu abbia perso o meno l'associazione (ad esempio se cpuTotal viene passato come argomento in una chiamata di funzione). È possibile modificare associare la raccolta alla funzione cpuTotal nella funzione di inizializzazione. Non ho ancora testato, ma fare un tentativo (complimenti a @ Brian per raccomandare a ridurre):

window.ServerList = Backbone.Collection.extend({ 

    model: Server, 

    initialize: function() { 
     _.bind(this.cpuTotal, this); // From Underscore.js 
    }, 

    cpuTotal: function(){ 
     return this.reduce(function(memo, value) { return memo + value.get("cpu") }, 0); 
    } 

}); 
Problemi correlati