2012-02-19 6 views
31

Estoy tratando de calcular la suma del campo 'precio' de un 'arreglo observable'. Tengo el siguiente código hasta ahora:Usando ko.utils.arrayForEach para iterar sobre un array observable

(function(){ 

function objFeatures(name,price) { 
     return { 
      name: ko.observable(name), 
      price: ko.observable(price), 

      removeFeatures: function() { 
       appViewModel.features.remove(this); 
      } 
     } 
    } 

var appViewModel = { 
features: ko.observableArray([ 
      new objFeatures("Feature1", 20), 
      new objFeatures("Feature2", 20) 
     ]), 

grandTotal: ko.computed(function() { 
      var total = 0; 
      ko.utils.arrayForEach(this.features(), function() { 
       total += this.price(); 
      }) 
      return total; 
     }) 
}; 

ko.applyBindings(appViewModel); 

}()); 

Cuando trato de ejecutar esto, me sale un "Error: this.features no es una función" en la consola de Firebug.

¿Qué estoy haciendo mal?

Respuesta

55

Los observables calculados se evalúan inmediatamente durante la creación. En su caso, appViewModel no se ha creado todavía y this no representará el appViewModel.

Hay muchas formas de asegurarse de que this sea correcto en este caso. Éstos son dos:

  1. crearlo fuera de su objeto inicial literal:

    var appViewModel = { 
        features: ko.observableArray([ 
         new objFeatures("Feature1", 20), 
         new objFeatures("Feature2", 20) 
         ]) 
    }; 
    
    appViewModel.grandTotal = ko.computed(function() { 
        var total = 0; 
        ko.utils.arrayForEach(this.features(), function(feature) { 
         total += feature.price(); 
        }); 
    
        return total; 
    }, appViewModel); 
    
  2. Cree su modelo de vista en una función:

    var AppViewModel = function() { 
        this.features = ko.observableArray([ 
         new objFeatures("Feature1", 20), 
         new objFeatures("Feature2", 20) 
        ]); 
    
        this.grandTotal = ko.computed(function() { 
         var total = 0; 
         ko.utils.arrayForEach(this.features(), function(feature) { 
          total += feature.price(); 
         }); 
         return total; 
        }, this); 
    }; 
    
    ko.applyBindings(new AppViewModel());​ 
    
+0

Fui con la primera enfoque, ahora no puedo acceder 'this.price()' – nthapa13

+2

Finalmente utilicé (no tengo absolutamente ninguna idea de cómo funcionó esto) --- 'var self = this; $ .each (self.features(), function() { total + = this.price(); }); 'pero el uso de ko.utils.arrayForEach aún no funciona, gracias por su respuesta. – nthapa13

+1

@ Nthapa13 No noté la sintaxis que estaba usando en esa parte. Actualicé las respuestas anteriores para mostrar que la función que especifique en 'ko.utils.arrayForEach' recibe el elemento como su primer argumento, luego no necesita usar' this' en la función. –