2012-02-19 12 views
31

पर पुनरावृत्त करने के लिए प्रत्येक 'अवलोकन योग्य' के 'मूल्य' फ़ील्ड की गणना करने की कोशिश कर रहा हूं। फ़ायरबग कंसोल में: "this.features कार्य नहीं है त्रुटि"ko.utils.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); 

}()); 

जब मैं इस चलाने का प्रयास, मैं एक मिल: मैं कोड निम्नलिखित अब तक की है।

मैं क्या गलत कर रहा हूं?

उत्तर

55

गणना के दौरान तत्काल अवलोकन योग्य मूल्यांकन का मूल्यांकन किया जाता है। आपके मामले में, appViewModel अभी तक नहीं बनाया गया है और thisappViewModel का प्रतिनिधित्व नहीं करेगा।

इस मामले में 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' का उपयोग करने की आवश्यकता नहीं है। –

संबंधित मुद्दे