angularJs过滤嵌套对象Track by

时间:2014-07-30 18:26:45

标签: angularjs angularjs-ng-repeat angular-filters

我创建了一个自定义过滤器,但它给了我一个错误 我在这里创造了一个小提琴:

Fiddle

我有这个用户数据:

    data: [{
        profile: {
            firstName: 'John',
            lastName: 'OConner'
        }
    }, {
        profile: {
            firstName: 'Smith',
            lastName: 'OConner'
        }

    }, {
        profile: {
            firstName: 'James',
            lastName: 'Bond'
        }
    }]

我需要通过此

按嵌套的obj - 配置文件进行过滤
data: [{
        column: {
            label: 'firstName',
        }
    }, {
        column: {
            label: 'lastName',
        }

    }]

我可以过滤,但却给了我这个错误:

这是我的过滤器:

myApp.filter('testFilter', ['$filter',
function($filter) {

    return function(items, selectedFilter) {

        var returnArray = items;
        var filtered = [];

        var process = {};
        process.filtered = [];

        process.loop = function(obj, key) {
            var filtered = [];
            this.obj = obj;
            this.key = key;
            // console.log('obj--> ', obj);
            // console.log('key--> ', key);

            filtered = filtered.concat($filter('filter')(items, process.superFilter));

            if (filtered.length > 0) {
                process.filtered = filtered;
            }

        };

        process.superFilter = function(value) {
            var returnMe;
            var originalValue = value.profile[process.key];

            if (typeof(value) === 'String') {
                originalValue = originalValue.toLowerCase();
            }

            if (originalValue === process.obj) {
                console.log('found');
                returnMe = value;
                return returnMe;
            }

        };



        if (Object.getOwnPropertyNames(selectedFilter).length !== 0) {
            angular.forEach(selectedFilter, function(obj) {
                filtered = filtered.concat($filter('filter')(items, obj));
            });

            returnArray = filtered;

            // console.log('selectedFilter ', selectedFilter);
        }


        return returnArray;
    };
  }
]);

不允许在转发器中重复。使用'跟踪'表达式以指定唯一键。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您需要使用track by,如错误所示。如果您没有可以使用的唯一密钥,则可以使用$index

ng-repeat='talent in talents.data | testFilter:filterInput track by $index'

以下是您的代码的工作示例:http://jsfiddle.net/hwT4P/