ng-repeat track by не работает: медленно и все еще генерирует $$hashKey

У меня есть ng-repeat, настроенный так:

ng-repeat="article in main[main.mode].primary | orderBy: main[main.mode].primary.filter.order
track by article.url"

main[main.mode].primary это массив и....filter.order это строка

Согласно этому сообщению в блоге

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

Восстановление списка - очень распространенная задача, и приложение зависает более секунды, отсюда мой интерес к отслеживанию. В соответствии со многими вопросами и документами, которые я просмотрел, я использовал правильный синтаксис для упорядочивания и отслеживания массива. Из документов:

пункт в элементах | filter:searchText track by item.id - это шаблон, который можно использовать для применения фильтра к элементам в сочетании с выражением отслеживания.

Почему не отслеживать, будучи реализованным? Я бегу угловой 1.3.11.

Изменить Это даже не работает, если я уберу аргумент orderBy

ng-repeat="article in main[main.mode].primary track by article.url"

1 ответ

Решение

В соответствии с угловой документацией orderBy работает только с массивами, поэтому, если вы выполняете итерации по объекту, вы не сможете использовать его, если не конвертируете свой объект в массив

https://docs.angularjs.org/api/ng/filter/orderBy

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

var narr=[]
angular.forEach(object,function(k,v){
  narr.push({key:v,value:v})
})

и теперь narr - это массив, готовый для сортировки по ключу или значению с помощью orderBy

Другие вопросы по тегам