Проблемы с использованием ng-repeat и 'unique'

0

Моя проблема - загадочная. Когда я использую 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>

Как вы можете видеть, здесь есть "уникальный", и для этого я использую Angular UI. Там много дубликатов ссылок, и поскольку я использую флажки в качестве фильтра, мне нужны только определенные флажки, а не столько флажков, сколько времен, на которые он ссылается, что будет делать только один ng-repeat.

Он функционирует точно так же, как если бы я удалял уникальный, но когда у меня было уникальное в том, что происходит, вместо того, чтобы давать мне несколько флажков, которые являются уникальными, он просто дает мне один флажок.

Из того, что я тестировал, похоже, это происходит, когда вы ссылаетесь на (извините, что я не знаю термин для него), когда у вас есть более глубокие ссылки на него, поэтому project.c.projectRef в отличие от project.projectRef.

Я был в шоке от этой проблемы, поэтому любые исправления, а также информация по этому вопросу были бы весьма признательны.

Теги:
angular-ui
checkbox
angularjs-ng-repeat

1 ответ

0
Лучший ответ

На самом деле я подозревал. Угловой пользовательский интерфейс не любит вложенные ссылки, вам нужно отредактировать файл 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню