Angular 1.5自定义过滤器返回数据问题

时间:2017-02-02 06:00:10

标签: javascript angularjs data-binding

  module.filter('myCustomFilter', function ($filter) {
        return function(items, searchedTxt, headers) {
            if (headers.choice === "option1") {
                return resultByDates(items, searchedTxt);
            } else if (headers.choice === "option2") {
                return resultByName(items, searchedTxt, headers);
            }
            else if (headers.choice === "option3") {
                return resultSimple(items, searchedTxt);
            }
            return items;
        };
        function resultByDates(items, search) {
            if (search === undefined || search === null)
                return items;
            var k = Object.keys(search)[0];
            var i;
            for (i = 0; i < items.length; i++) {
                items[i][k] = $filter('date')(items[i][k], "MM/dd/yyyy");
            }
            var filteredData = $filter('filter')(items, search);
            var indexes = [];
            for (i = 0; i < filteredData.length; i++) {
                indexes.push(items.indexOf(filteredData[i]));
            }
            var output = [];
            for (i = 0; i < indexes.length; i++) {
                output.push(items[indexes[i]]);
            }
            return output;
        }

        function resultByName(items, search, headers) {
            if (search === undefined || search === null)
                return items;
            if (headers !== undefined) {
                var k = Object.keys(search)[0];
                var i;
                var componentVals = headers.componentVals;
                var itemsCopy = angular.copy(items);
                for (i = 0; i < items.length; i++) {
                    for (var obj in componentVals) {
                        if (componentVals[obj].ID === itemsCopy[i][k]) {
                            itemsCopy[i][k] = componentVals[obj].Name;
                            break;
                        }
                    }
                }
                var filteredData = $filter('filter')(itemsCopy, search);
                var indexes = [];
                for (i = 0; i < filteredData.length; i++) {
                    indexes.push(itemsCopy.indexOf(filteredData[i]));
                }
                var output = [];
                for (i = 0; i < indexes.length; i++) {
                    output.push(items[indexes[i]]);
                }
                return output;
            }
            return items;
        }
        function resultSimple(items, search) {
            if (search === undefined || search === null)
                return items;
            return $filter('filter')(items, search);
        }
    });

大家好,我上面的过滤器有效 - 部分,Option1和Option3返回正确的过滤数据,但是Option2存在一些问题。

当我使用Option1过滤数据时,它会返回正确过滤的数据,然后我可以使用Option3进行过滤,并且过滤错误地返回先前的数据。当我使用Option2时,似乎返回的数据没有与前一个返回绑定,它返回单独的数据。它似乎是一个单独的集合...我在Option2中返回数据的方式有什么问题吗? / p>

希望我已经充分解释了问题。感谢。

Himmel 建议的一些修复版本。

module.filter('myCustomFilter', function ($filter) {
    return function (items, searchedTxt, headers) {
        var key;
        var i;
        var indexes;
        var filteredData;
        var output;
        if (headers.choice === "option1") {
            key = Object.keys(searchedTxt)[0];
            for (i = 0; i < items.length; i++) {
                items[i][key] = $filter('date')(items[i][key], "MM/dd/yyyy");
            }
            filteredData = $filter('filter')(items, searchedTxt);
            indexes = [];
            for (i = 0; i < filteredData.length; i++) {
                indexes.push(items.indexOf(filteredData[i]));
            }
            output = [];
            for (i = 0; i < indexes.length; i++) {
                output.push(items[indexes[i]]);
            }
            return output;
        } else if (headers.choice === "option2") {
            key = Object.keys(searchedTxt)[0];
            var componentVals = headers.componentVals;
            var itemsCopy = angular.copy(items);
            for (i = 0; i < items.length; i++) {
                for (var obj in componentVals) {
                    if (componentVals[obj].ID === itemsCopy[i][key]) {
                        itemsCopy[i][key] = componentVals[obj].Name;
                        break;
                    }
                }
            }
            filteredData = $filter('filter')(itemsCopy, searchedTxt);
            indexes = [];
            for (i = 0; i < filteredData.length; i++) {
                indexes.push(itemsCopy.indexOf(filteredData[i]));
            }
            output = [];
            for (i = 0; i < indexes.length; i++) {
                output.push(items[indexes[i]]);
            }
            return output;
        } else if (headers.choice === "option3") {
            return $filter('filter')(items, searchedTxt);
        }
        return items;
    };
});

我终于找到了问题......所以当我用Option3过滤时没有问题因为我在过滤之前没有修改集合,之后我用Option1过滤了我对集合做了mods因为我想基于过滤器进行过滤显示格式化日期。最后,当我使用Option3时,我只是根据当前Option3过滤器的需求修改集合 - 在不考虑过滤之前我应该​​考虑我在Option2过滤期间所做的mod。要确认/测试我创建了一个全局数组来保存我修改过的集合,所以每次我使用该全局数组的任何选项进行过滤。这是非常脏的临时解决方案,但它的工作原理。希望我足够澄清这个问题。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

似乎你正在尝试将学习JavaScript和Angular结合起来,同时也是困难时期!

module.filter('myCustomFilter', function ($filter) {

        // You probably aren't trying to return "function", here
        return function(items, searchedTxt, headers) {
            if (headers.choice === "option1") {
                return resultByDates(items, searchedTxt);
            } else if (headers.choice === "option2") {
                return resultByName(items, searchedTxt, headers);
            }
            else if (headers.choice === "option3") {
                return resultSimple(items, searchedTxt);
            }
            return items;
        };

        // are you declaring another function after you've returned?
        function resultByDates(items, search) {
            if (search === undefined || search === null)
                return items;
            var k = Object.keys(search)[0];
            var i;
            for (i = 0; i < items.length; i++) {
                items[i][k] = $filter('date')(items[i][k], "MM/dd/yyyy");
            }
            var filteredData = $filter('filter')(items, search);
            var indexes = [];
            for (i = 0; i < filteredData.length; i++) {
                indexes.push(items.indexOf(filteredData[i]));
            }
            var output = [];
            for (i = 0; i < indexes.length; i++) {
                output.push(items[indexes[i]]);
            }
            return output;
        }

        // another??
        function resultByName(items, search, headers) {
            if (search === undefined || search === null)
                return items;
            if (headers !== undefined) {
                var k = Object.keys(search)[0];
                var i;
                var componentVals = headers.componentVals;
                var itemsCopy = angular.copy(items);
                for (i = 0; i < items.length; i++) {
                    for (var obj in componentVals) {
                        if (componentVals[obj].ID === itemsCopy[i][k]) {
                            itemsCopy[i][k] = componentVals[obj].Name;
                            break;
                        }
                    }
                }
                var filteredData = $filter('filter')(itemsCopy, search);
                var indexes = [];
                for (i = 0; i < filteredData.length; i++) {
                    indexes.push(itemsCopy.indexOf(filteredData[i]));
                }
                var output = [];
                for (i = 0; i < indexes.length; i++) {
                    output.push(items[indexes[i]]);
                }
                return output;
            }
            return items;
        }

        // christ!!
        function resultSimple(items, search) {
            if (search === undefined || search === null)
                return items;
            return $filter('filter')(items, search);
        }
    });

因此,第一行function($filter) {...是触发列表过滤器时“调用”的函数。 返回的值将是构成新列表的值。

因此,如果您“返回”[1, 2, 3, 4],您将在浏览器的列表中看到这些内容。但是如果你的函数立即返回一个“函数”而不是“列表”([]),那么浏览器可能会做一些奇怪的事情......

哦等等,你正在调用一些超出当前函数的函数。可能从当前函数调用中移除resultByDates,以及resultByName ... ,把它们作为兄弟姐妹加入module.filter

这个问题很难解决这么多问题,你能否解决一个更简单的问题?也许是一小段意想不到的行为?