在Knockout.js模型中创建项之间的关系

时间:2012-08-24 16:42:31

标签: javascript knockout.js

jsFiddle http://jsfiddle.net/brandondurham/g3exx/

如何在模型中的各种observableArrays之间创建关系?例如,在我的模型中,我有一个cartItems数组,该数组中的每个项都有一个嵌套的{{1数组以及itemFreebies属性。客户只有在购物车中订阅时才能获得免费物品(itemType),因此,当删除该订阅时,我需要删除所有其他购物车商品的免费赠品,最好使用漂亮的fadeOut动画。

创建这些类型的条件关系的最佳方法是什么?

这是我在模型中使用的对象:

"itemType" : "subscription"

1 个答案:

答案 0 :(得分:1)

我会从这样的事情开始:

$(function () {
    ​var CartViewModel = {
        var self = this;

        self.cartItems = ko.observableArray([]);

        self.eligibleForFreebies = ko.computed(function() {
            return ko.utils.arrayFirst(self.cartItems(), function(cartItem) {
                // I forgot the () after itemType in the original post
                return (cartItem.itemType() === 'subscription');
            });
            // Note: ko.utils.arrayFirst will either return the item in 
            //      question, or it will return undefined or null… 
            //      I forget which, but either will result in 
            //      eligibleForFreebies evaluating to false
        });
    };

    var Product = function() {
        var self = this;

        self.itemName = ko.observable();
        self.itemDesc = ko.observable();
        self.itemType = ko.observable();
        self.itemPrice = ko.observable();
        self.itemFreebies = ko.observableArray([]);
    };

    var Freebie = function() {
        var self = this;

        self.freebieName = ko.observable();
        self.freebieDesc = ko.observable();
        self.freebieOriginalPrice = ko.observable();
    }

    ko.applyBindings(new CartViewModel());
    // load data
});

将产品加载到CartViewModel中的cartItems observableArray。

依赖的可观察(ko.computed)值eligibleForFreebies将决定是否允许免费赠送。

当购物车不符合条件时,您甚至不需要从产品中删除免费赠品 - 只需检查eligibleForFreebies并在显示屏,发票等中包含或排除免费赠品(这可能会让您省去在用户添加订阅后检索免费赠品的麻烦,但我认为这取决于您的方案。)

希望这有助于您开始使用此功能,但如果您有任何疑问,请与我们联系。

更新:forked your fiddle并重新编写了一些代码...好吧,我大部分时间都移动了它,但我确实添加了一些功能。

请注意,如果您从购物车中删除订阅商品,所有免费赠品都会从购物车显示中消失 - 但我没有从对象中删除它们!

如果添加了一个方法来重新添加订阅项到购物车,免费赠品就会重新出现。

如果有机会,请看一下,如果您希望我解释一下,请告诉我。