KnockoutJS фильтрует ObservableArray другим ObservableArry

Допустим, у меня есть модель представления с наблюдаемым массивом продуктов, который имеет массив категорий (идентификатор, имя) в объекте продукта. Затем у меня также есть наблюдаемый массив фильтров, которые являются просто категориями. Есть ли способ, которым я могу найти все продукты, которые имеют все категории в наблюдаемом массиве фильтров. Итак, мне нужно вернуть все продукты, которые имеют все категории в массиве фильтров, а не только один фильтр, но продукт должен содержать все фильтры. заранее спасибо


person Joshua    schedule 08.08.2012    source источник


Ответы (1)


Я думаю, это должно выглядеть так:

        function Product(id, name) {
            this.id = id;
            this.name = name;
            this.categories = [];
        }

        function ProductCategory(name) {
            this.name = name;
        }

        function ViewModel() {
            this.products = ko.observableArray();
            this.filters = ko.observableArray();
            var self = this;

            //dummy data
            self.init = function () {
                var c1 = new ProductCategory('Cat1');
                var c2 = new ProductCategory('Cat2');
                var c3 = new ProductCategory('Cat3');
                var c4 = new ProductCategory('Cat4');

                var p1 = new Product(1, 'Prod 1');
                p1.categories = [c1, c2];

                var p2 = new Product(2, 'Prod 2');
                p2.categories = [c1, c3, c4];

                var p3 = new Product(3, 'Prod 3');
                p3.categories = [c3, c4];

                var p4 = new Product(4, 'Prod 4');
                p4.categories = [c1, c2, c4];

                self.products([p1, p2, p3, p4]);
                self.filters([c1, c3, c4]);
            };

            self.init();

            //filtered products will be recalculated on products or filters array change
            self.filteredProducts = ko.computed(function () {
                var filteredProducts = [];
                ko.utils.arrayForEach(self.products(), function (product) {
                    var notInFilter = false;

                    for (var i = 0; i < product.categories.length; i++) {
                        var category = product.categories[i];

                        if (self.filters().indexOf(category) < 0) {
                            notInFilter = true;
                            break;
                        }
                    }

                    if (!notInFilter) {
                        filteredProducts.push(product);
                    }
                });

                return filteredProducts;
            });
        }

Скрипка с кодом

person vadim    schedule 08.08.2012