AngularJS多选自定义过滤器无法按预期工作

时间:2018-03-20 23:44:33

标签: arrays angularjs json multi-select angularjs-filter

在AngularJS记录显示(带过滤器)中,我有一个多选区域,用户可以从中选择以查明特定区域中是否有某个项目。

数组返回一个值列表,例如

['001','010','200']

根据所选地区的ID。然后根据记录的JSON列表检查,其中JSON值看起来像这样

territoriesnotavailable: "001, 085, 090"

每条记录要么设置为null,要么有一个到多个数字的列表。

我目前使用以下代码(customFilter),如果你只选择一个值,它可以很好地工作..如果在多选中选择的区域在地域列表中不可用,它基本上会过滤掉项目

function CustomTerritoryFilter() {
    return function(data, query) {
        if (query.length === 0) return data;
        if (data) return data.filter(function(item) {
            for (var i = 0; i < query.length; i++) {
                var queryitem = query[i]["id"];

                if(item.territoriesnotavailable) {
                    stringB = item.territoriesnotavailable;
                } else {
                    stringB = 'xxxxxxxx';
                }

                stringA = queryitem;
                if (!(stringB.indexOf( stringA ) > -1)) {
                    return data;
                }
            }
        });
        return [];
    };
}

因此,如果我只选择一个过滤器(例如,导致查询['010']。并且这显示在记录的区域内可用...它会按预期消失..但如果我选择任何不在的值地区不可用该项目再次出现..如果任何选定的区域出现在列表中,我需要记录消失,无论是否有

2 个答案:

答案 0 :(得分:0)

function CustomTerritoryFilter() {
    return function(data, query) {
        if (query.length === 0) return data;
        if (data) return data.filter(function(item) {
            for (var i = 0; i < query.length; i++) {
                var queryitem = query[i]["id"];
                if(item.territoriesnotavailable) {
                    stringB = item.territoriesnotavailable;
                } else {
                    stringB = 'xxxxxxxx';
                }

                stringA = queryitem;
                if (!(stringB.indexOf( stringA ) > -1)) {
                    return false;
                }
            }
            return true;
        });
        return [];
    };
}

答案 1 :(得分:0)

这是我确定的代码。它基本上将标志设置为1(显示),然后检查过滤器中的每个数字..如果列表中只有一个数字出现,则标志设置为零。在检查结束时,如果flaG REMAins为1

,则会显示数据
function CustomTerritoryFilter() {
    return function(data, query) {
        if (query.length === 0) return data;
        if (data) return data.filter(function(item) {
            var flag = 1;
            for (var i = 0; i < query.length; i++) {
                var queryitem = query[i]["id"];

                if(item.territoriesnotavailable) {
                    stringB = item.territoriesnotavailable;
                } else {
                    stringB = 'xxxxxxxx';
                }

                stringA = queryitem;
                if (stringB.indexOf( stringA ) > -1) {
                    flag = 0;
                }
            }
            if(flag === 1) {
                return data;
            }
        });
        return [];
    };
}