ng-repeat не работает с коллекциями, содержащими дубликаты

Следующий код не работает, так как коллекция содержит повторы:

<div ng-repeat="value in [4, 4]"></div>

Я думаю, что следующее должно работать, но, к сожалению, не работает:

<div ng-repeat="value in [4, 4] track by $index"></div>

Это ошибка?

Есть ли способ использовать ng-repeat для коллекции, содержащей дубликаты?

Заранее спасибо,

Оливье


person odwl    schedule 08.12.2013    source источник


Ответы (3)


Эта функция была добавлена ​​в AngularJS в более новых версиях. дело в том, что в основном вы должны перебирать не некоторые примитивные типы (например, числа), а некоторые сложные объекты.

насколько я понял, директива ngRepeat проверяет ссылки, а не фактические значения, поэтому, если вы выполняете итерацию по некоторым сложным объектам, она работает, но если вы попытаетесь сделать это для набора примитивных типов, она, скорее всего, не будет работать до тех пор, пока «все "Значения отличаются друг от друга.

ИЗМЕНИТЬ

Следующие строки скопированы и вставлены из этой ссылки (и убедитесь, что вы используете относительно современная версия AngularJS - я использую 1.1.5, и она отлично работает -)

Описание

Происходит при наличии повторяющихся ключей в выражении ngRepeat. Повторяющиеся ключи запрещены, потому что AngularJS использует ключи для связывания узлов DOM с элементами.

По умолчанию коллекции имеют ключ по ссылке, что желательно для большинства распространенных моделей, но может быть проблематичным для интернированных примитивных типов (общие ссылки).

Например, проблема может быть вызвана этим недопустимым кодом:

<div ng-repeat="value in [4, 4]">
</div>

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

Чтобы решить приведенный выше пример, можно использовать track by $index, что приведет к тому, что элементы будут указываться по их положению в массиве, а не по их значению:

<div ng-repeat="value in [4, 4] track by $index"></div>
person Kia Panahi Rad    schedule 08.12.2013
comment
Хорошо, но тем не менее, "отслеживание по $index" должно работать на int нет? - person odwl; 08.12.2013
comment
track by $index кажется реализованным stackoverflow.com/questions/21763136 - person Günter Zöchbauer; 13.02.2014

Одна вещь, которую вы можете сделать, это добавить «отслеживать по $index», как в angular documentation, который изменит логику отслеживания на индекс элемента, а не на значение элемента, но при этом будут отображаться повторяющиеся значения. Чтобы отображать только уникальные значения, вы можете отфильтровать уникальные значения, написав такую ​​функцию:

    var uniqueValues = function(data){
        var check = {};
        var uniqueValue = [];
        for(i-0;i<data.length;i++){
           if(!check[data[i]]){
              uniqueValue.push(data[i]);
              check(data[i]) = true;
           }
        }
        return uniqueValue;
}

а затем выполните ng-repeat для этого.

person Aditya Anand Krishna    schedule 06.06.2015

Сторонний фильтр Angular Filter содержит «уникальный» фильтр, который предоставит вам только уникальные записи в вашей коллекции.

https://github.com/a8m/angular-filter

Использование:

коллекция | уникальный: "свойство"

person TWLATL    schedule 18.11.2015