Knockoutjs:如何按类型和mediatype过滤

时间:2015-10-26 15:53:04

标签: javascript c# knockout.js

6天前,我问过这个问题:

how to select from filtervalues where genre comma delimited values contain only what is selected

我得到了答案;并且一位研究员为解决方案提供了这个小提琴:

https://jsfiddle.net/AnishPatelUk/7swLn92c/

但我遇到了另一个问题。虽然我让它搜索匹配的逗号字符串并返回匹配的长度等于数组。此代码不完整。

目标是让用户选择多个类型并显示这些类型。但是当用户选择媒体类型如DVD或Bluray时。结果应显示来自流派的所有项目为DVD和/或蓝光。

例如:

用户选择:冒险,科幻,然后是蓝光;只有星球大战和黑客应该出现。

如果用户选择:冒险,科幻;应该出现“星球大战”,“指环王”和“黑客帝国”。

选择我使用过的一场比赛:

var match = ko.utils.arrayFirst(genreValues,
function (genre) {
return self.filterValues.indexOf(genre.trim()) > -1;});
if (match) {
   return match;
}

但是为了显示我使用的所有匹配结果:

var matches = ko.utils.arrayFilter(genreValues, function (genre) { return 
self.filterValues.indexOf(genre.trim()) >= 0; });
return matches.length === self.filterValues().length;

也许有一种方法可以将它们结合起来?这是我的小提琴尝试: https://jsfiddle.net/0jr5Lc25/

1 个答案:

答案 0 :(得分:2)

    self.filterProducts = ko.computed(function () {
    return ko.utils.arrayFilter(self.products(),function (product) {
        var genreValues = product.genre.split(",");
        var mediaValues = product.media;
        var genreMatch = false;
        var mediaMatch = false;
        ko.utils.arrayForEach(genreValues, function (genre) {
            if( self.filterValues.indexOf(genre.trim()) >= 0){
                genreMatch = true;
            }
            //return self.filterValues.indexOf(genre.trim()) >= 0;
        });
        if(self.filterMedia().length === 0){
            mediaMatch = true;
        }
        if(self.filterValues().length === 0){
            genreMatch = true
        }
        // if string
        if(self.filterMedia().indexOf(mediaValues.trim()) >= 0){
          mediaMatch = true;
        }
        // if array
        //ko.utils.arrayForEach(mediaValues, function (media) {
            //if(self.filterMedia().indexOf(media.trim()) >= 0){
                //mediaMatch = true;
            //}
        //});
        if(genreMatch && mediaMatch){
        return true;
        } return false;
    });
});

你有一些问题;

  1. ko.utils.arrayFilter只需要使用一次。

  2. var mediamatches = ko.utils.arrayFilter(mediaValues ...正在与需要为mediaValues的self.filterValues进行比较。

  3. BlueRay并不等于BluRay

  4. Sci-Fi html复选框正在修正html。

  5. https://jsfiddle.net/0jr5Lc25/36/