Estoy tratando de calcular la suma de ‘precio’ de campo de un ‘observableArray’. Tengo el siguiente código hasta el momento:

(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 intento ejecutarlo, me sale un «Error: este.características no es una función» en la consola de firebug.

¿Qué estoy haciendo mal?

InformationsquelleAutor nthapa | 2012-02-19

1 Comentario

  1. 59

    Calculadas las características observables se evalúa de forma inmediata durante la creación. En su caso, appViewModel aún no se ha creado y this no representan la appViewModel.

    Hay muchas maneras de asegurarse de que this es correcto en este caso. Aquí son dos:

    1. Crear 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. Crear 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());​
    • me fui con el primer enfoque, ahora no puedo acceder a this.price()
    • Finalmente he utilizado (tengo absolutamente ninguna idea de cómo funcionaba)— var self = this; $.each(self.features(), function () { total += this.price(); }); pero el uso de ko.utils.arrayForEach todavía no funciona, gracias por tu respuesta, aunque.
    • No me di cuenta de la sintaxis que se utiliza en esa parte. He actualizado las respuestas anteriores para mostrar que la función que se especifica en ko.utils.arrayForEach recibe el elemento como su primer argumento, entonces usted no necesita usar this en la función.

Dejar respuesta

Please enter your comment!
Please enter your name here