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

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

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

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

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

Это ошибка?

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

Спасибо заранее,

Оливье

Ответы

Ответ 1

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

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

ИЗМЕНИТЬ

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

Описание

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

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

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

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

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

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

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

Ответ 2

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

    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.

Ответ 3

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

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

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

коллекция | unique: 'свойство'