Aparentemente, Angular 2 usará tuberías en lugar de filtros como en Angular1 junto con ng-for para filtrar resultados, aunque la implementación aún parece ser vaga, sin documentación clara.
A saber, lo que estoy tratando de lograr podría verse desde la siguiente perspectiva
<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>
¿Cómo implementarlo usando tuberías?
angular
typescript
Khaled
fuente
fuente
<div *ngFor="let item of itemsList" *ngIf="conditon(item)" ...
*ngFor
y*ngIf
en el mismo elemento no son compatibles. Debes cambiar a la forma explícita de uno de ellos"Respuestas:
Básicamente, escribe una tubería que luego puede usar en la
*ngFor
directiva.En su componente:
En su plantilla, puede pasar cadena, número u objeto a su tubería para usar para filtrar:
En tu pipa:
Recuerde registrar su tubería en
app.module.ts
; ya no necesita registrar las tuberías en su@Component
Aquí hay un Plunker que muestra el uso de una tubería de filtro personalizada y la tubería de corte incorporada para limitar los resultados.
Tenga en cuenta (como han señalado varios comentaristas) que hay una razón por la cual no hay tuberías de filtro integradas en Angular.
fuente
*ngFor
parámetros entre paréntesis, solo para evitar cualquier confusión y hacer que sea "a prueba de cambios":<li *ngFor="let item of (items | myfilter:filterargs)">
Muchos de ustedes tienen excelentes enfoques, pero el objetivo aquí es ser genéricos y definir una tubería de matriz que sea extremadamente reutilizable en todos los casos en relación con * ngFor.
callback.pipe.ts (no olvide agregar esto a la matriz de declaración de su módulo)
Luego, en su componente, debe implementar un método con la siguiente firma (item: any) => boolean , en mi caso, por ejemplo, lo llamé filterUser, que filtra la edad de los usuarios que es mayor de 18 años.
Su componente
Y por último, pero no menos importante, su código html se verá así:
Su HTML
Como puede ver, este Pipe es bastante genérico en todos los elementos similares a la matriz que deben filtrarse mediante una devolución de llamada. En mi caso, me pareció muy útil para * ngPara escenarios similares.
¡¡¡Espero que esto ayude!!!
codematrix
fuente
this
ser indefinido, puede escribir su método en su componente como enfilterUser = (user: IUser) =>
lugar defilteruser(user: IUser)
this
su método componente es porque el método se estaba utilizando como devolución de llamada ythis
se aplicó un nuevo contexto. Te encontraste con un problema común en JavaScript orientado a objetos, pero hay una solución antigua y fácil: unes métodos para usarlos como devoluciones de llamada a la clase original. En su constructor, agregue el siguiente código:this.myCallbackFunc = this.myCallbackFunc.bind(this);
Eso es todo. Nunca volverás a perderthis
.Forma simplificada (se usa solo en matrices pequeñas debido a problemas de rendimiento. En matrices grandes, debe hacer el filtro manualmente mediante código):
Ver: https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
Uso:
Si usa una variable como segundo argumento, no use comillas.
fuente
Esto es lo que implementé sin usar pipe.
componente.html
componente.ts
fuente
itemList
un observable y utilizar el filtro asíncrono:let item of itemsList | async
. Cuando ocurre un cambio, haga que el observable emita la nueva lista. De esta manera, el código de filtrado solo se ejecuta cuando es necesario.No estoy seguro de cuándo llegó, pero ya hicieron un tubo de corte que lo hará. También está bien documentado.
https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html
fuente
;
. por ejemplo:*ngFor="let feature of content?.keyFeatures | slice:1:5; trackBy feature?.id"
También puede usar lo siguiente:
Esto solo mostrará el div si sus artículos coinciden con la condición
Consulte la documentación angular para obtener más información. Si también necesita el índice, utilice lo siguiente:
fuente
Las tuberías en Angular2 son similares a las tuberías en la línea de comando. La salida de cada valor precedente se alimenta al filtro después de la tubería, lo que facilita el encadenamiento de los filtros así:
fuente
item
de*ng-for="#item of itemsList"
debe usarse para filtrar los resultados como tal*ng-if="conditon(item)"
. Lo que no funciona en este ejemplo ..item
si se cumple la condición y no tiene valor si no se cumple.*ngFor
y*ngIf
en el mismo elemento no son compatibles.<template ngFor ...>
Para este requisito, implemento y publico un componente genérico . Ver
https://www.npmjs.com/package/w-ng5
Para usar estos componentes, antes, instale este paquete con npm:
Después, importe el módulo en app.module
En el siguiente paso, agregue en la sección declarar de app.module:
Uso de la muestra
Filtrar cadenas simples
Filtrado de cadenas complejas: campo 'Valor' en el nivel 2
Filtrado de cadenas complejas - campo medio - 'Valor' en el nivel 1
Filtrado de matriz compleja simple - campo 'Nome' nivel 0
Filtrado en campos de árbol: campo 'Valor' en el nivel 2 o 'Valor' en el nivel 1 o 'Nome' en el nivel 0
Filtrado de campo inexistente - 'Valor' en nivel 3 inexistente
Este componente funciona con un nivel de atributo infinito ...
fuente
*ngFor="let inovice of invoices | filter:searchInvoice"
y está buscando en mi lista, pero muestra una lista en blanco, ¿sabes por qué?Una solución simple que funciona con Angular 6 para filtrar un ngFor, es la siguiente:
Los tramos son útiles porque no representan inherentemente nada.
fuente
Sé que es una vieja pregunta, sin embargo, pensé que podría ser útil ofrecer otra solución.
equivalente de AngularJS de esto
en Angular 2+ no puede usar * ngFor y * ngIf en un mismo elemento, por lo que será el siguiente:
y si no puede usarlo como contenedor interno, use ng-container en su lugar. ng-container es útil cuando desea agregar condicionalmente un grupo de elementos (es decir, usando * ngIf = "foo") en su aplicación, pero no desea envolverlos con otro elemento.
fuente
He creado un plunker basado en las respuestas aquí y en otros lugares.
Además he tenido que añadir una
@Input
,@ViewChild
yElementRef
de la<input>
y crear ysubscribe()
a un observable de la misma.Filtro de búsqueda Angular2: PLUNKR (ACTUALIZACIÓN: plunker ya no funciona)
fuente
La tubería sería el mejor enfoque. pero debajo de uno también funcionaría.
fuente
Este es mi código:
Muestra:
fuente
Otro enfoque que me gusta usar para los filtros específicos de la aplicación es usar una propiedad personalizada de solo lectura en su componente que le permita encapsular la lógica de filtrado de manera más limpia que usar una tubería personalizada (IMHO).
Por ejemplo, si quiero enlazar
albumList
y filtrarsearchText
:Para enlazar el HTML, puede enlazar a la propiedad de solo lectura:
Creo que para los filtros especializados que son específicos de la aplicación, esto funciona mejor que una tubería, ya que mantiene la lógica relacionada con el filtro con el componente.
Las tuberías funcionan mejor para filtros reutilizables a nivel mundial.
fuente
Creé la siguiente tubería para obtener los elementos deseados de una lista.
La conversión en minúsculas es solo para coincidir en mayúsculas y minúsculas. Puede usarlo en su vista así: -
fuente
Idealmente, debe crear una tubería angualr 2 para eso. Pero puedes hacer este truco.
fuente
Basado en la solución de tubería de devolución de llamada muy elegante propuesta anteriormente, es posible generalizarlo un poco más permitiendo que se pasen parámetros de filtro adicionales. Entonces tenemos:
callback.pipe.ts
componente
html
fuente
Aquí hay un ejemplo que creé hace un tiempo, y en el que escribí en un blog, que incluye un golpe de trabajo. Proporciona una tubería de filtro que puede filtrar cualquier lista de objetos. Básicamente, solo especifica la propiedad y el valor {clave: valor} dentro de su especificación ngFor.
No es muy diferente de la respuesta de @ NateMay, excepto que lo explico con un detalle relativamente detallado.
En mi caso, filtré una lista desordenada en algún texto (filterText) que el usuario ingresó contra la propiedad "etiqueta" de los objetos en mi matriz con este tipo de marcado:
https://long2know.com/2016/11/angular2-filter-pipes/
fuente
El primer paso que crea Filter usando
@Pipe
en su archivo component.ts:your.component.ts
Y estructura de datos del objeto Persona:
person.ts
En su vista en el archivo html:
your.component.html
fuente
Esta es tu matriz
Este es tu ngFor loop Filtrar por:
Allí estoy usando filterProduct instantáneo de productos, porque quiero preservar mis datos originales. Aquí el modelo _filterText se usa como un cuadro de entrada. Cuando haya alguna función de cambio, se llamará. En setFilterText se llama a performProduct, devolverá el resultado solo a aquellos que coincidan con la entrada. Estoy usando minúsculas para mayúsculas y minúsculas.
fuente
Después de buscar en Google, me encontré
ng2-search-filter
. In tomará su objeto y aplicará el término de búsqueda a todas las propiedades del objeto en busca de una coincidencia.fuente
Estaba buscando algo para hacer que un filtro pase un objeto, luego puedo usarlo como filtro múltiple:
Hice esta solución de belleza:
filter.pipe.ts
componente.ts
componet.html
fuente