使用 ng-repeat 和 'unique' 的问题

Problems using ng-repeat and 'unique'

我的问题是一个令人费解的问题。当我使用 ng-repeat 重复我的数据以创建复选框时,它按我预期的方式工作。我会得到我提到的所有东西,它们有重复项。下面是一个片段。

 <label ng-if="project.score !='0'" data-ng-repeat="project in projects | unique:'c.projectRef' | orderBy:'c.projectRef'">
                    <input
                        id="project.c.projectRef"
                        type="checkbox"
                        ng-click="toggleSelection(project.c.projectRef)"
                        ng-checked="selectedRefs.indexOf(project.c.projectRef) > -1" />
                        <span>{{project.c.projectRef}}</span>
</label>

如您所见,'unique' 就在那里,我正在为此使用 Angular UI。有许多重复引用,因为我将复选框用作过滤器,所以我只想要不同的复选框,而不是与引用次数一样多的复选框,这就是 ng-repeat 单独做的事情。

它的功能与我删除 unique 完全一样,但是当我有 unique 时,发生的事情不是给我几个都是唯一的复选框,而是给我一个复选框。

从我一直在测试的情况来看,当您引用(抱歉,我不知道它的术语)数据时,当您对数据有更深入的引用时,似乎会发生这种情况,因此 project.c.projectRef 而不是project.projectRef

我被这个问题难住了,因此非常感谢任何修复以及有关该问题的信息。

其实是我怀疑的。 Angular UI 不喜欢嵌套引用,您必须编辑 angular-ui.js 文件并用此添加替换唯一函数。

.filter('unique', function () {

return function (items, filterOn) {



    if (filterOn === false) {

        return items;

    }



    if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {

        var hashCheck = {}, newItems = [];



        var extractValueToCompare = function (item) {

            if (angular.isObject(item) && angular.isString(filterOn)) {



                var resolveSearch = function(object, keyString){

                    if(typeof object == 'undefined'){

                        return object;

                    }

                    var values = keyString.split(".");

                    var firstValue = values[0];

                    keyString = keyString.replace(firstValue + ".", "");

                    if(values.length > 1){

                        return resolveSearch(object[firstValue], keyString);

                    } else {

                        return object[firstValue];

                    }

                }



                return resolveSearch(item, filterOn);

            } else {

                return item;

            }

        };



        angular.forEach(items, function (item) {

            var valueToCheck, isDuplicate = false;



            for (var i = 0; i < newItems.length; i++) {

                if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) {

                    isDuplicate = true;

                   break;

                }

            }

            if (!isDuplicate) {

                if(typeof item != 'undefined'){

                    newItems.push(item);

                }

            }



        });

        items = newItems;

    }

    return items;