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