【问题标题】:AngularJS multiselect custom filter not working as intendedAngularJS 多选自定义过滤器未按预期工作
【发布时间】:2018-03-20 23:44:33
【问题描述】:

在 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']。这会出现在可供记录的区域中。它会按预期消失。但如果我选择任何不在其中的值地区不可用该项目再次出现..如果任何选定的地区出现在列表中,我需要记录消失,无论任何没有出现

【问题讨论】:

  • 我怀疑我需要在某个时候添加一个失败标志,以停止更多检查

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


【解决方案1】:
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 [];
    };
}

【讨论】:

  • 这没有工作有几个原因..如果我选择了一个在区域不可用 (tna) 中的值,则该项目出现..如果我选择了一个不在 tna 中的值,它就会消失..如果我每个都有一个..它出现了。我终于得到了一个可行的解决方案,它使用了一个有效的标记系统
【解决方案2】:

这是我确定的代码。它基本上将标志设置为 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 [];
    };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多