Как я могу получить обратный массив в угловых? я пытаюсь использовать фильтр orderBy, но для сортировки ему нужен предикат (например, «имя»):
<tr ng-repeat="friend in friends | orderBy:'name':true">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
<tr>
Есть ли способ отменить исходный массив без сортировки. как это:
<tr ng-repeat="friend in friends | orderBy:'':true">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
<tr>
ng-repeat
поведения! @Trevor Senior проделал хорошую работу.Ответы:
Я бы предложил использовать пользовательский фильтр, такой как этот:
Который затем может быть использован как:
Посмотрите это работает здесь: Демонстрация Плункер
Этот фильтр можно настроить в соответствии с вашими потребностями. Я привел другие примеры в демонстрации. Некоторые параметры включают проверку того, что переменная является массивом перед выполнением обратного, или сделать ее более снисходительной, чтобы разрешить обращение большего количества вещей, таких как строки.
источник
items.reverse()
модифицирует массив, а не просто создает новый и возвращает его.slice()
чтобы решить эту проблему.if (!angular.isArray(items)) return false;
чтобы убедиться, что у вас есть массив, прежде чем пытаться обратить его.Это то, что я использовал:
Обновить:
Мой ответ был в порядке для старой версии Angular. Теперь вы должны использовать
ng-repeat="friend in friends | orderBy:'-'"
или
с https://stackoverflow.com/a/26635708/1782470
источник
track by
, это единственный способ, который работал для меняng-repeat="friend in friends | orderBy:'+': true track by $index"
Извините, что поднял этот вопрос через год, но есть новое, более простое решение , которое работает для Angular v1.3.0-rc.5 и новее .
Он упоминается в документации : «Если ни одно из свойств не предусмотрено (например , „+“) , то сам элемент массива используется для сравнения , где сортировки». Итак, решение будет:
ng-repeat="friend in friends | orderBy:'-'"
илиng-repeat="friend in friends | orderBy:'+':true"
Это решение кажется лучше, потому что оно не модифицирует массив и не требует дополнительных вычислительных ресурсов (по крайней мере, в нашем коде). Я прочитал все существующие ответы и до сих пор предпочитаю этот.
источник
v1.3.0-rc.4
). Если у кого-нибудь появится шанс попробовать его в новом выпуске, сообщите нам!v1.3.0-rc.5
( rc.5 docs против rc.4 docs ). Я обновил ответorderBy:'+':true
,orderBy:'-':true
,orderBy:'-':false
,orderBy:'+':false
:(Вы можете повернуть по параметру $ index
источник
$index
). Я на Angular 1.1.5.ng-repeat="friend in friends | orderBy:'id':true"
работает.Простое решение: - (нет необходимости делать какие-либо методы)
источник
Вы можете просто вызвать метод в своей области, чтобы отменить его для вас, например так:
Обратите внимание, что
$scope.reverse
создает копию массива, посколькуArray.prototype.reverse
изменяет исходный массив.источник
если вы используете 1.3.x, вы можете использовать следующее
Пример Список книг по дате публикации в порядке убывания
источник: https://docs.angularjs.org/api/ng/filter/orderBy
источник
Если вы используете angularjs версии 1.4.4 и выше , простой способ сортировки - использование « $ index ».
посмотреть демо
источник
При использовании MVC в .NET с Angular вы всегда можете использовать OrderByDecending () при выполнении вашего запроса БД следующим образом:
Тогда на угловой стороне, это будет уже полностью изменено в некоторых браузерах (IE). При поддержке Chrome и FF вам нужно будет добавить orderBy:
В этом примере вы сортируете в порядке убывания свойства .Id. Если вы используете пейджинг, это становится более сложным, потому что будет отсортирована только первая страница. Вам нужно будет обработать это через файл фильтра .js для вашего контроллера или каким-либо другим способом.
источник
Вы также можете использовать .reverse (). Это встроенная функция массива
<div ng-repeat="friend in friends.reverse()">{{friend.name}}</div>
источник
reverse
переворачивает массив на месте, он не просто возвращает перевернутую копию. Это означает, что каждый раз, когда это оценивается, массив будет инвертирован.Это потому, что вы используете JSON Object. Когда вы сталкиваетесь с такими проблемами, тогда измените ваш JSON Object на JSON Array Object.
Например,
источник
orderBy
Фильтр выполняет стабильную сортировку в угловых 1.4.5. (См. Запрос извлечения GitHub https://github.com/angular/angular.js/pull/12408 .)Поэтому достаточно использовать постоянный предикат и
reverse
установитьtrue
:источник
Я нашел что-то вроде этого, но вместо массива я использую объекты.
Вот мое решение для объектов:
Добавить пользовательский фильтр:
Который затем может быть использован как
Если вам нужна поддержка старого браузера, вам нужно определить функцию уменьшения (это доступно только в ECMA-262 mozilla.org )
источник
Я сам разочаровался в этой проблеме и поэтому изменил фильтр, созданный @Trevor Senior, когда столкнулся с проблемой с моей консолью, сказав, что она не может использовать обратный метод. Я также хотел сохранить целостность объекта, потому что именно это Angular изначально использует в директиве ng-repeat. В этом случае я использовал ввод stupid (ключ), потому что консоль будет расстроена, говоря, что есть дубликаты, и в моем случае мне нужно было отслеживать по $ index.
Фильтр:
HTML:
<div ng-repeat="items in items track by $index | reverse: items">
источник
Я добавляю один ответ, который никто не упомянул. Я бы попытался заставить сервер сделать это, если он у вас есть. Фильтрация на стороне клиента может быть опасной, если сервер возвращает много записей. Потому что вы можете быть вынуждены добавить пейджинг. Если у вас есть пейджинг с сервера, тогда фильтр клиента по порядку будет на текущей странице. Что бы запутать конечного пользователя. Поэтому, если у вас есть сервер, отправьте заказ с помощью звонка и дайте серверу вернуть его.
источник
Полезный совет:
Вы можете перевернуть массив с помощью vanilla Js: yourarray .reverse ()
Внимание: реверс является разрушительным, поэтому он изменит ваш массив, а не только переменную.
источник
Я бы рекомендовал использовать метод обратного массива, всегда лучший выбор, чем создание фильтра или использование
$index
.Plnkr_demo .
источник