2012-02-19 20 views
31

Tôi đang cố tính tổng của trường 'giá' của 'observableArray'. Tôi có đoạn code sau cho đến nay:Sử dụng ko.utils.arrayForEach để lặp qua một 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); 

}()); 

Khi tôi cố gắng chạy này, tôi nhận được một "Lỗi: this.features không phải là một chức năng" trong bảng điều khiển firebug.

Tôi đang làm gì sai?

Trả lời

55

Các quan sát được tính toán được đánh giá ngay lập tức trong khi tạo. Trong trường hợp của bạn, appViewModel chưa được tạo và this sẽ không đại diện cho appViewModel.

Có nhiều cách để đảm bảo rằng this là chính xác trong trường hợp này. Dưới đây là hai:

  1. Tạo nó bên ngoài của đối tượng ban đầu của bạn theo nghĩa đen:

    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. Tạo mô hình điểm của bạn trong một chức năng:

    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

tôi đã đi với người đầu tiên phương pháp tiếp cận, bây giờ tôi không thể truy cập 'this.price()' – nthapa13

+2

Cuối cùng tôi được sử dụng (Tôi đã hoàn toàn không có ý tưởng làm thế nào điều này làm việc) --- 'var tự = này; $ .each (self.features(), function() { tổng số + = this.price(); }); 'nhưng sử dụng ko.utils.arrayForEach vẫn không hoạt động, cảm ơn bạn đã phản hồi. – nthapa13

+1

@ Nthapa13 Tôi không nhận thấy cú pháp bạn đang sử dụng trên phần đó. Tôi đã cập nhật các câu trả lời ở trên để chỉ ra rằng hàm mà bạn chỉ định trong 'ko.utils.arrayForEach' nhận được đối số đầu tiên của nó, sau đó bạn không cần sử dụng' this' trong hàm. –

Các vấn đề liên quan