Aparentemente, o Angular 2 usará pipes em vez de filtros, como no Angular1 em conjunto com ng-for para filtrar os resultados, embora a implementação ainda pareça vaga, sem documentação clara.
Ou seja, o que estou tentando alcançar pode ser visto da seguinte perspectiva
<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>
Como implementar isso usando tubos?
angular
typescript
Khaled
fonte
fonte
<div *ngFor="let item of itemsList" *ngIf="conditon(item)" ...
*ngFor
e*ngIf
o mesmo elemento não é suportado. Você precisa mudar para a forma explícita de um deles"Respostas:
Basicamente, você escreve um pipe que pode ser usado na
*ngFor
diretiva.No seu componente:
No seu modelo, você pode passar uma string, número ou objeto para o seu pipe para usar para filtrar:
No seu pipe:
Lembre-se de registrar seu cachimbo
app.module.ts
; você não precisa mais registrar os tubos no seu@Component
Aqui está um Plunker que demonstra o uso de um tubo de filtro personalizado e o tubo de fatia incorporado para limitar os resultados.
Observe (como vários comentaristas apontaram) que há uma razão pela qual não há tubos de filtro embutidos no Angular.
fonte
*ngFor
parâmetros entre parênteses, apenas para evitar qualquer confusão e torná-la "à prova de alterações":<li *ngFor="let item of (items | myfilter:filterargs)">
Muitos de vocês têm ótimas abordagens, mas o objetivo aqui é ser genérico e definir um canal de matriz extremamente reutilizável em todos os casos em relação a * ngFor.
callback.pipe.ts (não esqueça de adicionar isso ao array de declaração do seu módulo)
Então, em seu componente, você precisa implementar um método com a seguinte assinatura (item: any) => booleano , no meu caso, por exemplo, eu chamei de filterUser, que filtra a idade dos usuários com mais de 18 anos.
Seu componente
E por último, mas não menos importante, seu código html ficará assim:
O seu HTML
Como você pode ver, esse Pipe é bastante genérico em toda a matriz, como itens que precisam ser filtrados por meio de um retorno de chamada. No mycase, achei muito útil para * ngPara cenários semelhantes.
Espero que isto ajude!!!
codematrix
fonte
this
ser indefinido, você pode escrever seu método em seu componente comofilterUser = (user: IUser) =>
, em vez defilteruser(user: IUser)
this
no método de componente é porque o método estava sendo usado como retorno de chamada e um novothis
contexto foi aplicado. Você encontrou um problema comum no javascript orientado a objetos, mas há uma solução antiga e fácil: você vincula métodos a serem usados como retornos de chamada na classe original. No seu construtor, adicione o seguinte código:this.myCallbackFunc = this.myCallbackFunc.bind(this);
É isso. Você nunca perderáthis
novamente.Maneira simplificada (Usado apenas em matrizes pequenas devido a problemas de desempenho. Em matrizes grandes, é necessário fazer o filtro manualmente via código):
Consulte: https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
Uso:
Se você usar uma variável como segundo argumento, não use aspas.
fonte
Isso é o que eu implementei sem usar o pipe.
component.html
component.ts
fonte
itemList
um observável e usar o filtro assíncrona:let item of itemsList | async
. Quando ocorrer uma alteração, faça o observável emitir a nova lista. Dessa forma, o código de filtragem é executado apenas quando necessário.Não sei ao certo quando ele chegou, mas eles já fizeram um tubo de fatia que fará isso. Também está bem documentado.
https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html
fonte
;
. por exemplo:*ngFor="let feature of content?.keyFeatures | slice:1:5; trackBy feature?.id"
Você também pode usar o seguinte:
Isso só mostrará a div se seus itens corresponderem à condição
Consulte a documentação angular para obter mais informações Se você também precisar do índice, use o seguinte:
fonte
tubos no Angular2 são semelhantes aos tubos na linha de comando. A saída de cada valor anterior é inserida no filtro após o tubo, o que facilita a cadeia de filtros, assim:
fonte
item
from*ng-for="#item of itemsList"
deve ser usada para filtrar os resultados como tal*ng-if="conditon(item)"
. O que não funciona neste exemplo.item
se a condição for atendida e nenhum valor se não for.*ngFor
e*ngIf
no mesmo elemento não são suportados. Você precisa mudar para a forma explícita para um deles<template ngFor ...>
Para esse requisito, implementei e publico um componente genérico . Vejo
https://www.npmjs.com/package/w-ng5
Para usar esses componentes, antes, instale este pacote com o npm:
Depois, importe o módulo no app.module
Na próxima etapa, adicione a seção declarar do app.module:
Uso da amostra
Filtrando sequência simples
Filtrar cadeia complexa - campo 'Valor' no nível 2
Filtragem de cadeia complexa - campo do meio - 'Valor' no nível 1
Filtragem de matriz complexa simples - campo 'Nome' nível 0
Filtrando em campos de árvore - campo 'Valor' no nível 2 ou 'Valor' no nível 1 ou 'Nome' no nível 0
Filtrando campo inexistente - 'Valor' no nível inexistente 3
Este componente trabalha com nível de atributo infinito ...
fonte
*ngFor="let inovice of invoices | filter:searchInvoice"
e ele está pesquisando na minha lista, mas mostra uma lista em branco, você sabe por quê?Uma solução simples que funciona com o Angular 6 para filtrar um ngFor, é a seguinte:
Os períodos são úteis porque não representam nada inerentemente.
fonte
Sei que é uma pergunta antiga, no entanto, pensei que poderia ser útil oferecer outra solução.
equivalente a AngularJS deste
no Angular 2+, você não pode usar * ngFor e * ngIf em um mesmo elemento; portanto, será o seguinte:
e se você não puder usar como contêiner interno, use ng-container. ng-container é útil quando você deseja anexar condicionalmente um grupo de elementos (por exemplo, usando * ngIf = "foo") em seu aplicativo, mas não deseja agrupá-los com outro elemento.
fonte
Eu criei um plunker com base nas respostas aqui e em outros lugares.
Além disso eu tinha que adicionar um
@Input
,@ViewChild
eElementRef
do<input>
e criar esubscribe()
para um observável dele.Filtro de pesquisa Angular2: PLUNKR (UPDATE: plunker não funciona mais)
fonte
Pipe seria a melhor abordagem. mas abaixo de um também funcionaria.
fonte
Este é o meu código:
Amostra:
fonte
Outra abordagem que eu gosto de usar para filtros específicos de aplicativos é usar uma propriedade somente leitura personalizada em seu componente, que permite encapsular a lógica de filtragem de maneira mais limpa do que usar um pipe personalizado (IMHO).
Por exemplo, se eu desejar vincular
albumList
e filtrarsearchText
:Para vincular o HTML, você pode vincular à propriedade somente leitura:
Acho que para filtros especializados, específicos da aplicação, isso funciona melhor do que um pipe, pois mantém a lógica relacionada ao filtro com o componente.
Os tubos funcionam melhor para filtros reutilizáveis globalmente.
fonte
Criei o seguinte canal para obter os itens desejados de uma lista.
Conversão em minúsculas é apenas para corresponder de maneira insensível a maiúsculas. Você pode usá-lo em sua visualização da seguinte maneira: -
fonte
Idealmente, você deve criar um tubo angualr 2 para isso. Mas você pode fazer esse truque.
fonte
Com base na solução de pipe de retorno de chamada muito elegante proposta acima, é possível generalizá-la um pouco mais, permitindo que parâmetros adicionais de filtro sejam transmitidos. Temos então:
callback.pipe.ts
componente
html
fonte
Aqui está um exemplo que eu criei há algum tempo, e escrevi em um blog, que inclui um esforço de trabalho. Ele fornece um tubo de filtro que pode filtrar qualquer lista de objetos. Basicamente, você apenas especifica a propriedade e o valor {key: value} dentro da sua especificação ngFor.
Não é muito diferente da resposta de @ NateMay, exceto que eu explico isso em detalhes relativamente detalhados.
No meu caso, filtrei uma lista não ordenada em algum texto (filterText) que o usuário inseriu na propriedade "label" dos objetos em minha matriz com esse tipo de marcação:
https://long2know.com/2016/11/angular2-filter-pipes/
fonte
A primeira etapa que você cria o Filter usando
@Pipe
no seu arquivo component.ts:your.component.ts
E estrutura de dados do objeto Person:
person.ts
Na sua opinião no arquivo html:
your.component.html
fonte
Este é o seu array
Este é o seu loop ngFor Filtrar por:
Lá estou usando o filterProduct instantâneo de produtos, porque quero preservar meus dados originais. Aqui, o modelo _filterText é usado como uma caixa de entrada. Sempre que houver alguma função do alterador de alterações será chamada. No setFilterText, performProduct é chamado, ele retornará o resultado apenas para aqueles que correspondem à entrada. Estou usando letras minúsculas para não fazer distinção entre maiúsculas e minúsculas.
fonte
Depois de pesquisar no Google, me deparei
ng2-search-filter
. In pegará seu objeto e aplicará o termo de pesquisa a todas as propriedades do objeto que procuram uma correspondência.fonte
Eu estava procurando algo para fazer um filtro passar um objeto, então eu posso usá-lo como multi-filtro:
eu fiz esta solução de beleza:
filter.pipe.ts
component.ts
componet.html
fonte