2012-02-19 8 views
31

'observableArray'の 'price'フィールドの合計を計算しようとしています。私は、これまでに次のコードを持っている:私はこれを実行しようとするとko.utils.arrayForEachを使用してobservableArrayを反復する

(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は関数ではありません」を取得放火魔コンソールで

私は間違っていますか?

答えて

55

計算されたオブザーバブルは、作成中に直ちに評価されます。あなたの場合、appViewModelはまだ作成されておらず、thisappViewModelを表すことはありません。

この場合、thisが正しいことを確認する方法はたくさんあります。ここでは2つです:

  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(){ total + = this.price(); });しかし、ko.utils.arrayForEachを使用してもまだ動作しません。 – nthapa13

+1

@ Nthapa13私はあなたがその部分で使っていた構文に気付かなかった。上記の答えを更新して、 'ko.utils.arrayForEach'で指定した関数がその項目を最初の引数として受け取ると、関数で' this'を使う必要はありません。 –

関連する問題