Я не могу перевести этот код с Angualr 1 на Angular 2:
ng-repeat="todo in todos | orderBy: 'completed'"
Вот что я сделал после ответа Тьерри Темплиера:
Шаблон компонента:
*ngFor="#todo of todos | sort"
Код компонента:
@Component({
selector: 'my-app',
templateUrl: "./app/todo-list.component.html",
providers: [TodoService],
pipes: [ TodosSortPipe ]
})
Код трубы:
import { Pipe } from "angular2/core";
import {Todo} from './todo';
@Pipe({
name: "sort"
})
export class TodosSortPipe {
transform(array: Array<Todo>, args: string): Array<Todo> {
array.sort((a: any, b: any) => {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
});
return array;
}
}
Я пытаюсь отсортировать массив Todo
s, упорядоченный по свойству completed
. Сначала, todo.completed = false
а затем todo.complete = true
.
Я не очень хорошо понимаю transform
метод и то, как передавать аргументы в этом методе и в sort
методе.
Какой args: string
аргумент? Что такое a
и b
откуда они берутся?
angular
angular2-template
angular-pipe
Александр Абакумов
источник
источник
Ответы:
Я изменил ответ @Thierry Templier, чтобы канал мог сортировать пользовательские объекты в angular 4:
И использовать это:
Надеюсь, это кому-то поможет.
источник
The pipe 'sort' could not be found
. Могу ли я каким-то образом вставить канал в свой компонент, как в угловых двух каналах: [ArraySortPipe]?См. Https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe для полного обсуждения. Эта цитата наиболее актуальна. По сути, для крупномасштабных приложений, которые следует агрессивно минимизировать, логика фильтрации и сортировки должна перемещаться в сам компонент.
источник
filteredHeroes
иsortedHeroes
, я думаю, идея заключается в том, что при инициализации компонента вы запускаете некоторую логику сортировки / фильтрации (возможно, вызываете метод из ngOnInit), затем устанавливаете это свойство с отсортированными / отфильтрованными результатами и только повторно запускайте логику / обновляйте свойство, если есть что-то, что вызывает необходимость (например, взаимодействие с пользователем запускает вызов AJAX, чтобы получить больше героев, или пользователь нажимает флажок, чтобы отфильтровать половину из них на основе некоторых критериев и т. д.)Для этого вы можете реализовать собственный канал, который использует
sort
метод массивов:Затем используйте эту трубу, как описано ниже. Не забудьте указать свой канал в
pipes
атрибуте компонента:Это простой пример для массивов со строковыми значениями, но у вас может быть расширенная обработка сортировки (на основе атрибутов объекта в случае массива объектов, на основе параметров сортировки ...).
Вот план для этого: https://plnkr.co/edit/WbzqDDOqN1oAhvqMkQRQ?p=preview .
Надеюсь, это поможет тебе, Тьерри
источник
sort
метод является методомArray
объекта JavaScript . См. Эту ссылку: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .pipes: [..]
объявление больше не действует (и больше не надо)Обновлен OrderByPipe: исправлено отсутствие сортировки строк.
создать класс OrderByPipe:
в вашем контроллере:
или в вашем
в вашем html:
источник
Angular не поставляется с фильтром orderBy из коробки, но если мы решим, что он нам нужен, мы легко его создадим. Однако есть некоторые предостережения, о которых мы должны знать, связанные со скоростью и минимизацией. Увидеть ниже.
Простая труба будет выглядеть примерно так.
Этот канал принимает функцию сортировки (
fn
) и дает ей значение по умолчанию, которое будет разумно сортировать массив примитивов. У нас есть возможность переопределить эту функцию сортировки, если мы хотим.Он не принимает имя атрибута в виде строки, потому что имена атрибутов подлежат минификации. Они изменятся, когда мы минимизируем наш код, но минификаторы недостаточно умны, чтобы также минимизировать значение в строке шаблона.
Сортировка примитивов (числа и строки)
Мы могли бы использовать это для сортировки массива чисел или строк, используя компаратор по умолчанию:
Сортировка массива объектов
Если мы хотим отсортировать массив объектов, мы можем дать ему функцию компаратора.
Предостережения - чистые и нечистые трубы
Angular 2 имеет концепцию чистых и нечистых труб.
Чистый канал оптимизирует обнаружение изменений с помощью идентификации объекта. Это означает, что конвейер будет работать только в том случае, если входной объект изменит идентификатор, например, если мы добавим новый элемент в массив. Он не будет спускаться в предметы. Это означает, что если мы изменим вложенный атрибут:
this.cats[2].name = "Fluffy"
например, конвейер не будет запускаться повторно. Это помогает Angular быть быстрым. Угловые трубы по умолчанию чистые.С другой стороны, нечистый канал будет проверять атрибуты объекта. Это потенциально делает его намного медленнее. Поскольку он не может гарантировать, что будет делать функция конвейера (возможно, он по-разному сортируется в зависимости от времени суток, например), нечистый канал будет запускаться каждый раз, когда происходит асинхронное событие. Это значительно замедлит работу вашего приложения, если массив большой.
Труба выше чистая. Это означает, что он будет работать только в том случае, если объекты в массиве неизменны. Если вы меняете кота, вы должны заменить весь объект кота новым.
Мы можем изменить указанное выше на нечистую трубу, установив чистый атрибут:
Эта труба будет спускаться в объекты, но будет медленнее. Используйте с осторожностью.
источник
Я создал канал OrderBy, который делает именно то, что вам нужно. Он также поддерживает сортировку по нескольким столбцам перечисляемого объекта.
Этот канал позволяет добавлять дополнительные элементы в массив после рендеринга страницы и динамически сортирует массив с обновлениями.
У меня есть запись о процессе здесь .
А вот рабочая демонстрация: http://fuelinteractive.github.io/fuel-ui/#/pipe/orderby и https://plnkr.co/edit/DHLVc0?p=info
источник
Рекомендую использовать lodash с угловым, тогда ваша труба будет следующей:
и используйте его в html, например
и не забудьте добавить Pipe в свой модуль
источник
Это будет работать для любого поля, которое вы ему передадите. ( ВАЖНО: он будет упорядочен только в алфавитном порядке, поэтому, если вы передадите дату, он упорядочит ее как алфавит, а не как дату)
источник
@Component
отсутствииpipes
собственности.Это хорошая замена для AngularJs orderby pipe в angular 4 . Легко и просто использовать.
Это URL-адрес github для получения дополнительной информации https://github.com/VadimDez/ngx-order-pipe
источник
Поскольку мы знаем, что filter и order by удалены из ANGULAR 2, и нам нужно написать свой собственный, вот хороший пример плункера и подробная статья
Он использовал как фильтр, так и orderby, вот код для трубы заказа
источник
Вы можете использовать это для объектов:
источник
В package.json добавьте что-нибудь вроде (эта версия подходит для Angular 2):
В вашем модуле машинописного текста (и массиве импорта):
источник
источник
В текущей версии Angular2 каналы orderBy и ArraySort не поддерживаются. Для этого вам нужно написать / использовать несколько пользовательских каналов.
источник
Для версии Angular 5+ мы можем использовать пакет ngx-order-pipe
Ссылка на исходный учебник
Установить пакет
Модуль импорта в приложениях
использовать где угодно
источник
orderby Pipe в Angular JS будет поддерживать, но Angular (более поздние версии) не будет поддерживать . Пожалуйста, найдите детали, обсуждаемые для увеличения производительности, и скорость его устаревания.
https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
источник
источник