Flex/AS3 – Truques E Dicas #10 – DP filterFunction


Este é mais um dos exemplos que já muita gente usa mas que outros tantos não conhecem… Trata-se da propriedade filterFunction presente na class ArrayCollection.

Num dos meus projectos tinha a necessidade de procurar entre 2500 entradas da base de dados alguns elementos e queria faze-lo em “real-time” ou seja, assim que o utilizador começar a escrever num campo de procura, a minha DataGrid começa a ser filtrada pelas letras/palavras inseridas na caixa de procura… a cada novo caracter introduzido a tabela seria filtrada por determinada ordem…

Claro que não é a tabela que vou filtrar, mas sim o seu DataProvider. Para já definidos alguns pontos como:
Caixa de procura e o listener às mudanças:

<mx:TextInput x="10" y="33" width="254" change="iniciaProcura()" id="procura"/>

o nosso dataProvider que é “imaginariamente” composto pelos campos “nome”, “prenome”, “endereco” e “telefone”:

[Bindable]
private var meuDP:ArrayCollection;

que está previamente preenchido com 2500 resultados e atribuido a uma datagrid.

E finalmente a nosssa função de procura que atribuirá uma segunda função como filtro ao DataProvider:

private function iniciaProcura():void {
  
meuDP.filterFunction=filtraPorEntrada;
  
meuDP.refresh();
  
//associamos a função que vai proceder à filtragem do DP e de seguida "actualizamos" o dataProvider.
}
 
private function filtraPorEntrada(item:Object):Boolean {
//esta função recebe cada entrada no dataProvider como "item" e devolve true/false no caso de corersponder ao
//texto introduzido na caixa de procura com o id="procura".
//vamos comparar o texto escrito primeiramente com o campo "nome", depois com o "endereco" e por final com o "telefone"
 
  
var encontrado:Boolean=false;
 
 
if(item.nome.toLowerCase().search(procura.text.toLowerCase()) != -1) encontrado = true;
 
else if(item.endereco.toLowerCase().search(procura.text.toLowerCase()) != -1) encontrado = true;
 
else if (item.telefone.toLowerCase().search(procura.text.toLowerCase()) != -1) encontrado = true;
 
else encontrado=false;
 
return encontrado;
 
}

Esta função à medida que é adicionado ou removido um caracter da caixa “procura” é accionada, filtrando assim os campos do dataProvider, e como este é [Bindable] actualizará a dataGrid automaticamente….

Esta procura, apesar das 2500 entradas na dataGrid, é feita muito rapidamente (sem render’s na dataGrid) pelo que é uma das melhores soluções para procura numa Datagrid, principalmente quando não queremos fazer chamadas repetidas a um backend para filtrar os dados.

Se quiserem remover o filtro, basta colocarem:

meuDP.filterFunction=undefined;
meuDP.refresh();

Simples e muito util…

Abraço.

Deixe um comentário ou um Trackback
   

8 Comentários

  1. April 27, 2009 às 11:48 am | Permalink

    Vlw pela dica, Mário.
    Pra grande massa de registros eu consigo uma performance imensa com essa funcionalidade!!!

  2. Dhimitri
    May 15, 2009 às 2:09 pm | Permalink

    Boa dica!
    valeu mesmo pessoal!

  3. Diego
    June 7, 2009 às 5:45 pm | Permalink

    Cara.. vou montar um altar para você…. só na ultima semana vc salvou minha vida pelo menos umas 15 vezes…

    Parabéns continue com o ótimo trabalho..

  4. andersen
    June 23, 2009 às 9:11 pm | Permalink

    item.cor.toLowerCase().search(procura3.text.toLowerCase()

    se for busca por string

    e c for uma busca por numbers

    ??
    oq muda ali

    obrigados

  5. andersen
    June 29, 2009 às 1:41 pm | Permalink

    aproveitando…
    se quisermos fazer dois filtros simultaneos, por exemplo
    tenho dois campos onde eu posso digitar, um deles eu pesquiso pelo nome, ok filtrado,
    a partir dos dados filtrados pelo nome, eu filtro novamente pelo telefone, assim em escala… como ficaria?
    abraco

  6. Rafael
    August 4, 2009 às 5:47 pm | Permalink

    Muito boa sua dica! Me poupou processamento no servidor: até então estava realizando muitas chamadas ao backend, com essa dica diminuo um pouco esse problema. Quanto à dúvida do anderson, acredito que para realizar mais de um filtro ao mesmo tempo a função que filtra deve realizar todos os filtros ao mesmo tempo. Por exemplo, para filtrar pelo conteúdo de duas caixas de texto, ambas poderiam chamar a mesma função no change, e dentro da função realizar a filtragem usando o conteúdo das duas caixas de texto (TextInput). Bom, é só uma idéia. Obrigado pela dica!

  7. George Pacheco
    July 22, 2010 às 6:12 pm | Permalink

    E ai grande Mario , blz.
    Cara, acabei de usar esta tua dica e funcionou uma beleza.
    Valeu por compartilhar este grande conhecimento que tu tem !!
    Um abração meu amigo.

  8. Armando
    July 27, 2010 às 5:22 pm | Permalink

    Simples e objetivo.
    Valeu pela dica.

Deixe um comentário

O seu email nunca será publicado ou partilhado. Campos obrigatórios estão marcados com um *

*
*

Spam Protection by WP-SpamFree