1

在我的视图模型中,我有一个需要从 $.getJSON 调用中填充的可观察数组。我想要一个计算出的 observable 来表示返回的 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当我尝试填充计算的 observable 时的值。this.coupons()错误:“this.coupons() 不是函数”。我需要做什么才能做到这一点,和/或我做错了什么?

4

1 回答 1

1

ko.computed() 在计算计算的 observable 时接受第二个参数,该参数定义“this”的值。因此,无论什么对象持有“优惠券”,您都希望将其作为第二个参数传递。

或者您可以尝试如下创建视图模型,而不是动态定义对象并将其作为参数传递给 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); 
于 2013-10-02T21:28:32.983 回答