2011-10-11 28 views
8

Estoy aprendiendo backbone. Tengo el siguienteObteniendo la suma de una colección (todos los modelos) 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'); 
    } 

}); 

Voy a llamar a esto desde el método de procesamiento de una vista como esta

window.AppView = Backbone.View.extend({ 

    // .... 

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

    } 
}); 

El total_cpu variable es siempre vacío pero los artículos siempre es correcta. Algunas ideas ?

Sé que mi colección está funcionando ya que tengo muchos elementos allí, pero necesito sumar todas las CPU de cada elemento de la colección para el resumen de la página.

Para aquellos que conocen todos los ejemplos http://documentcloud.github.com/backbone/docs/todos.html Tengo una configuración muy similar.

Respuesta

18

Aquí es la mejor manera que sé:

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

Aquí es una jsFiddle of the solution.

+1

+1 para el violín, y para aquellos interesados ​​en los documentos: http: //documentcloud.github. com/subrayado/# reducir –

4

Creo que su problema es que "esto" puede referir o no la instancia de su colección, dependiendo de si ha perdido o no su enlace (por ejemplo, si cpuTotal se pasa como argumento en una llamada de función). Puede cambiar vincular la colección a la función cpuTotal en la función de inicialización. No he probado esto, pero darle una oportunidad (felicitaciones a @ Brian para recomendar reducir):

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); 
    } 

}); 
Cuestiones relacionadas