2012-02-19 4 views
31

Я пытаюсь вычислить сумму поля «цена» для наблюдаемого массива. У меня есть следующий код до сих пор:Использование ko.utils.arrayForEach для итерации над наблюдаемымArray

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

}()); 

Когда я пытаюсь запустить это, я получаю «Ошибка: this.features не является функцией» в консоли Firebug.

Что я делаю неправильно?

ответ

55

Вычислительные наблюдаемые оцениваются сразу во время создания. В вашем случае appViewModel еще не был создан, и this не будет представлять appViewModel.

Существует много способов гарантировать, что this верен в этом случае. Вот два:

  1. Создать его за пределами вашего исходного объекта буквального:

    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. Создайте свою модель представления в функции:

    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

я пошел с первым подход, теперь я не могу получить доступ к this.price() ' – nthapa13

+2

Наконец, я использовал (я абсолютно не знаю, как это работает) ---' var self = this; $ .each (self.features(), function() { всего + = this.price(); }) ;, но использование ko.utils.arrayForEach все еще не работает, благодарю вас за ваш ответ. – nthapa13

+1

@ Nthapa13 Я не заметил синтаксиса, который вы использовали в этой части. Я обновил приведенные выше ответы, чтобы показать, что функция, указанная в 'ko.utils.arrayForEach', получает этот элемент в качестве первого аргумента, тогда вам не нужно использовать' this' в функции. –

 Смежные вопросы

  • Нет связанных вопросов^_^