По-видимому, Angular 2 будет использовать каналы вместо фильтров, как в Angular1 в сочетании с ng-for, для фильтрации результатов, хотя реализация все еще кажется расплывчатой, без четкой документации.
А именно то, что я пытаюсь достичь, можно рассматривать со следующей точки зрения
<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>
Как это реализовать, используя трубы?
angular
typescript
Халед
источник
источник
<div *ngFor="let item of itemsList" *ngIf="conditon(item)" ...
*ngFor
и*ngIf
для одного и того же элемента не поддерживаются. Вам нужно перейти к явной форме для одного из них»Ответы:
По сути, вы пишете канал, который затем можете использовать в
*ngFor
директиве.В вашем компоненте:
В вашем шаблоне вы можете передать строку, число или объект в ваш канал, чтобы использовать для фильтрации:
В твоей трубе:
Не забудьте зарегистрировать свою трубу в
app.module.ts
; вам больше не нужно регистрировать трубы в вашем@Component
Вот Plunker, который демонстрирует использование настраиваемой трубы фильтра и встроенной трубы среза для ограничения результатов.
Обратите внимание (как отметили несколько комментаторов), что есть причина, по которой в Angular нет встроенных фильтровальных трубок.
источник
*ngFor
заключить параметры в скобки, чтобы избежать путаницы и сделать ее «защищенной от изменений»:<li *ngFor="let item of (items | myfilter:filterargs)">
У многих из вас есть отличные подходы, но цель здесь состоит в том, чтобы быть универсальным и определить канал массива, который чрезвычайно многократно используется во всех случаях по отношению к * ngFor.
callback.pipe.ts (не забудьте добавить это в массив объявлений вашего модуля)
Затем в вашем компоненте вам нужно реализовать метод со следующей сигнатурой (item: any) => boolean , в моем случае, например, я назвал его filterUser, который фильтрует возраст пользователей, превышающий 18 лет.
Ваш Компонент
И наконец, что не менее важно, ваш HTML-код будет выглядеть так:
Ваш HTML
Как видите, этот канал довольно универсален для всех массивов, таких как элементы, которые необходимо отфильтровать с помощью обратного вызова. В mycase я обнаружил, что это очень полезно для * ng для подобных сценариев.
Надеюсь это поможет!!!
codematrix
источник
this
неопределенности, вы можете написать свой метод на вашем компоненте,filterUser = (user: IUser) =>
а неfilteruser(user: IUser)
this
метод компонента, заключается в том, что метод использовался в качестве обратного вызова иthis
был применен новый контекст. Вы столкнулись с общей проблемой в объектно-ориентированном javascript, но есть старое и простое решение: вы привязываете методы, которые будут использоваться в качестве обратных вызовов к исходному классу. В свой конструктор добавьте следующий код:this.myCallbackFunc = this.myCallbackFunc.bind(this);
Вот и все. Вы никогда не проиграетеthis
снова.Упрощенный способ (используется только для небольших массивов из-за проблем с производительностью. В больших массивах необходимо выполнить фильтр вручную с помощью кода):
Смотрите: https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
Использование:
Если вы используете переменную в качестве второго аргумента, не используйте кавычки.
источник
Это то, что я реализовал без использования трубы.
component.html
component.ts
источник
itemList
наблюдаемое и использовать асинхронную фильтр:let item of itemsList | async
. Когда произойдет изменение, сделайте наблюдаемый выброс нового списка. Таким образом, фильтрующий код запускается только при необходимости.Я не уверен, когда это вошло, но они уже сделали трубу среза, которая сделает это. Это также хорошо задокументировано.
https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html
источник
;
. Например:*ngFor="let feature of content?.keyFeatures | slice:1:5; trackBy feature?.id"
Вы также можете использовать следующее:
Это покажет div, только если ваши элементы соответствуют условию
См. Угловую документацию для получения дополнительной информации. Если вам также потребуется индекс, используйте следующее:
источник
трубы в Angular2 похожи на трубы в командной строке. Выход каждого предыдущего значения подается в фильтр после канала, что упрощает цепочку фильтров, например, так:
источник
item
from*ng-for="#item of itemsList"
должна использоваться для фильтрации результатов как таковых*ng-if="conditon(item)"
. Что не работает в этом примере ..item
если условие выполнено, и никакого значения, если оно не выполнено.*ngFor
и*ngIf
на том же элементе не поддерживаются. Вам нужно перейти к явной форме для одного из них<template ngFor ...>
Для этого требования я реализую и публикую общий компонент . Видеть
https://www.npmjs.com/package/w-ng5
Для использования этих компонентов, прежде чем установить этот пакет с npm:
После этого импортируйте модуль в app.module
На следующем шаге добавьте раздел объявлений в app.module:
Образец использования
Фильтрация простой строки
Фильтрация сложной строки - поле «Значение» на уровне 2
Фильтрация сложной строки - среднее поле - «Значение» на уровне 1
Фильтрация сложного массива простая - поле 'Ном' уровня 0
Фильтрация в полях дерева - поле «Доблесть» на уровне 2 или «Доблесть» на уровне 1 или «Ном» на уровне 0
Фильтрация несуществующего поля - «Доблесть» на несуществующем уровне 3
Этот компонент работает с бесконечным уровнем атрибута ...
источник
*ngFor="let inovice of invoices | filter:searchInvoice"
и он ищет в моем списке, но показывает пустой список, вы знаете, почему?Простое решение, которое работает с Angular 6 для фильтрации ngFor, это следующее:
Пролеты полезны, потому что по своей сути ничего не представляют.
источник
Я знаю, что это старый вопрос, однако я подумал, что было бы полезно предложить другое решение.
эквивалент AngularJS этого
в Angular 2+ вы не можете использовать * ngFor и * ngIf для одного и того же элемента, поэтому оно будет следующим:
и если вы не можете использовать в качестве внутреннего контейнера, используйте вместо этого ng-container. ng-container полезен, когда вы хотите условно добавить группу элементов (например, используя * ngIf = "foo") в свое приложение, но не хотите заключать их в другой элемент.
источник
Я создал плункер на основе ответов здесь и в других местах.
Кроме того , я должен был добавить
@Input
,@ViewChild
иElementRef
из<input>
и создать иsubscribe()
к наблюдаемым его.Фильтр поиска Angular2: PLUNKR (ОБНОВЛЕНИЕ: плункер больше не работает)
источник
Труба будет лучшим подходом. но ниже один также будет работать.
источник
Это мой код:
Образец:
источник
Другой подход, который мне нравится использовать для фильтров, специфичных для приложения, заключается в использовании настраиваемого свойства только для чтения в вашем компоненте, которое позволяет более аккуратно инкапсулировать логику фильтрации, чем использование настраиваемого канала (IMHO).
Например, если я хочу привязать
albumList
и отфильтроватьsearchText
:Чтобы связать в HTML, вы можете связать со свойством только для чтения:
Я нахожу для специализированных фильтров, которые являются специфическими для приложения, это работает лучше, чем конвейер, поскольку сохраняет логику, связанную с фильтром с компонентом.
Трубы лучше работают для фильтров многоразового использования.
источник
Я создал следующую трубу для получения нужных элементов из списка.
Преобразование в нижний регистр просто для сравнения в случае нечувствительности к регистру. Вы можете использовать это по вашему мнению, как это: -
источник
В идеале вы должны создать Angualr 2 трубы для этого. Но вы можете сделать этот трюк.
источник
Основываясь на предложенном выше очень элегантном решении обратного вызова, можно немного обобщить его, разрешив передавать дополнительные параметры фильтра. Затем мы имеем:
callback.pipe.ts
составная часть
HTML
источник
Вот пример, который я создал некоторое время назад и написал в блоге, который включает в себя рабочий план. Он предоставляет канал фильтрации, который может фильтровать любой список объектов. Вы просто указываете свойство и значение {key: value} в своей спецификации ngFor.
Это не сильно отличается от ответа @ NateMay, за исключением того, что я объясняю его в достаточно подробных деталях.
В моем случае я отфильтровал неупорядоченный список по некоторому тексту (filterText), который пользователь ввел, по свойству «label» объектов в моем массиве с помощью разметки такого рода:
https://long2know.com/2016/11/angular2-filter-pipes/
источник
Первый шаг, который вы создаете Filter, используя
@Pipe
ваш файл component.ts:your.component.ts
И структура данных объекта Person:
person.ts
На ваш взгляд в html файле:
your.component.html
источник
Это ваш массив
Это ваш цикл ngFor.
Там я использую filterProduct мгновенных продуктов, потому что я хочу сохранить свои исходные данные. Здесь модель _filterText используется в качестве поля ввода. Когда-либо будет вызываться функция установки изменений. В setFilterText executeProduct вызывается, он будет возвращать результат только тем, кто соответствует вводу. Я использую строчные буквы без учета регистра.
источник
После некоторого поиска в Google, я столкнулся
ng2-search-filter
. Он возьмет ваш объект и применит условие поиска ко всем свойствам объекта, которые ищут совпадение.источник
Я нашел кое-что для создания фильтра, передающего Объект, тогда я могу использовать его как мульти-фильтр:
я сделал это решение для красоты:
filter.pipe.ts
component.ts
componet.html
источник