2013-10-02 88 views
1

在我看來模型計算,我有一個觀察的數組,需要從一個$ .getJSON調用填充。我想要一個計算的可觀察值來表示返回的JSON中包含的「價格」列的總數。計算觀察到從異步數據

我已經成功地填充觀察到的陣列...

(function($){ 

    function Coupon(expiration, value) { 
     var self = this; 
     self.expiration = expiration; 
     self.value = value; 
    } 

    $(function() { 
     $.when($.getJSON(coupons_url, null)).done(function(couponsJson) { 
      ko.applyBindings({ 
       coupons: ko.utils.arrayMap(couponsJson[0].objects, 
        function(coupon) { 
         return new Coupon(coupon.expiration, coupon.value); 
        }) 

       savingsAvailable: ko.computed(function() { 
        var total = 0; 
        for (var i = 0; i < this.coupons().length; i++) { 
         total += parseFloat(this.coupons()[i].value/100); 
        } 
        return total.toFixed(2); 
       }) 
      }); 
     }); 

    }); 
})(jQuery); 

...但我不知道如何再訪問coupons值當我嘗試填充計算觀測。 this.coupons()出錯:「this.coupons()不是函數」。我需要做些什麼來完成這件事,和/或我做錯了什麼?

+0

我不是100%你正在試圖完成的事情,但是你計算機內的'this'不再引用你的視圖模型。我不明白你的JavaScript的語法,因爲我從來沒有這樣寫過。 –

+0

我明白了,很快就會發布更新。感謝您花時間看我的問題。 – Brandon

回答

1

ko.computed()採用限定的「這」評價時所計算的觀察到的值的第二參數。那麼,什麼是對象持有的「優惠券」,你想要通過它作爲第二個參數。

或者你可以嘗試像下面這樣創建一個視圖模型,而不是直接定義對象並將它作爲參數傳給applyBindings。

var Coupon = function(expiration, value) { 
    var self = this; 
    self.expiration = expiration; 
    self.value = value; 

} 

var viewModel = function(couponsJson){ 

    var self = this; 

    self.coupons = ko.utils.arrayMap(couponsJson[0].objects, function(coupon) { 
     return new Coupon(coupon.expiration, coupon.value); 
    }) 

    self.savingsAvailable = ko.computed(function() { 
     var total = 0; 
     for (var i = 0; i < self.coupons().length; i++) { 
       total += parseFloat(self.coupons()[i].value/100); 
     } 
     return total.toFixed(2); 
    })            

} 


(function($){ 
    $(function() { 
     $.when($.getJSON(coupons_url, null)).done(function(couponsJson) { 
      var vm = new viewModel(couponsJson) 
      ko.applyBindings(viewModel); 
     }); 

    }); 
})(jQuery);