Como construir um grid dinâmico utilizando Ext JS

30/07/2009 | By | 14 Comments

É muito simples criar um grid/tabela estático usando o widget grid da biblioteca Ext JS. O problema começa quando você quer criar um grid totalmente dinâmico.

Mas, em primeiro lugar, o que quero dizer com grid dinâmico?

Nos post anteriores sobre Ext JS, quando criava um grid, já sabia quais eram as colunas que iriam aparecer na tela para o usuário, e apenas escrevia o nome delas na configuração do grid:

 Como construir um grid dinâmico utilizando Ext JS

Mas e se eu tenho uma aplicação em que o usário tem a opção de escolher quais são as colunas/informações que ele quer ver? E Se o usuário tem a opção de ver 20 colunas e só escolher ver 5 delas? Eu não posso mostrar as outras 15 colunas se ele não optou por visulizar. Isso é que é criar um grid dinâmico.

E como eu implemento isso em Ext JS?

Esse foi um probleminha que gastei quase 1 semana de trabalho tentando resolver, já que estava apenas começando a brincar com a biblioteca javascript.

Procurei em vários blogs e no fórum oficial. As informações era vem escassas. Até que encontrei um exemplo que me deu a idéia de implementar a solulção que vou apresentar aqui.

Assim como nos exemplo anteriores, estou usando o Eclipse para desenvolver + Spring Framework (MVC e IoC) + json-lib-ext-spring (biblioteca para usar Json + Spring) + Ext JS 2.x.

Para deixar o grid totalmente dinâmico, preciso de uma maneira para configurar a definição das Colunas (Ext.grid.ColumnModel) e uma outra maneira para configurar os campos/fields do Ext.data.Store.

Configurando as colunas – Ext.grid.ColumnModel

Para representar as informações das colunas que definem o Ext.grid.ColumnModel, criei uma classe baseada nas informações que encontrei na documentação (http://extjs.com/deploy/ext/docs/output/Ext.grid.ColumnModel.html – Config Option). Como atributo, coloquei apenas aqueles que quero/preciso usar:

 Como construir um grid dinâmico utilizando Ext JS

Também foi criado um método genérico para criar um determinado número de colunas.

 Como construir um grid dinâmico utilizando Ext JS

E no Controller, preciso criar o objeto json que possui as informações referentes as colunas:

 Como construir um grid dinâmico utilizando Ext JS

No código Ext Js, carrego os dados, declaro quais são os campos da classe e adiciono um listener para tratar os dados e criar o Ext.grid.ColumnModel. Assim, vai pegar as informações (como se fosse carregar em um grid estático) e mapeá-las para o objeto correto:

 Como construir um grid dinâmico utilizando Ext JS

E já temos as colunas configuradas.

Agora precisamos configurar os campos e obter os dados que irão popular o grid (dinâmico).

Configurando os Campos/Fields do data.Store

Da mesma forma que fizemos com a configuração das colunas, também precisamos configurar dinamicamente os campos/fields. Mas como fazer isso ao mesmo tempo que tenho que carregar os dados do grid?

Uma das soluções é adicionar metadados (http://extjs.com/deploy/ext/docs/output/Ext.data.Store.html). Assim, podemos dizer em tempo real quais são as configurações para os dados do Store.

Nos metadados, defini as seguintes configurações: rows, totalProperty e fields. Rows são os dados que irão popular o grid. TotalProperty é a propriedade que indica o total de registros/linhas que a propriedade rows contém (e se tiver usando paginação, o total de registros). E fields é a propriedade que indica a configuração dos fields/campos.

Criei uma classe para representar os fields/campos do data.Store. Nela, apenas coloquei o atributo que é mais necessário, que é o nome do campo. Se desejar ou for preciso, também pode definir o tipo do dado e outras opções, que podem ser encontradas no link (http://extjs.com/deploy/ext/docs/output/Ext.data.Record.html – create).

 Como construir um grid dinâmico utilizando Ext JS

É preciso criar um objeto (neste caso em formato JSON) que represente essas propriedades, conforme a figura abaixo:

 Como construir um grid dinâmico utilizando Ext JS

Então, foi criado um método para gerar um objeto que representa a figura acima:

 Como construir um grid dinâmico utilizando Ext JS

E o um método para criar os dados:

 Como construir um grid dinâmico utilizando Ext JS

E no controller, fazer a junção de todas as informações. Uma observação importante, que, dependendo do caso, pode ter um impacto na performance: os metadados só precisam ser criados na primeira vez, pois o Store não conhece a configuração. Da segunda vez em diante, apenas é preciso fornecer os dados para popular o grid:

 Como construir um grid dinâmico utilizando Ext JS

No código Ext JS, criamos um Store ‘vazio’, apenas indicando a url onde deverá obter as informações.

 Como construir um grid dinâmico utilizando Ext JS

E por último, precisamos indicar ao Store, que as informações contém metadados. Para isso, usamos o parâmetro/valor ‘meta:true’:

 Como construir um grid dinâmico utilizando Ext JSE o resultado é este:

 Como construir um grid dinâmico utilizando Ext JS

O código completo desse post você pode fazer o download aqui (formato projeto Eclipse) – 4,95MB

icone download Como construir um grid dinâmico utilizando Ext JS

E se ainda não sabe como fazer para importar o projeto no eclipse e executar, pode conferir aqui.

Até a próxima!

icon smile Como construir um grid dinâmico utilizando Ext JS

Filed in: Ext JS 3, JSON | Tags: , , , , , , ,

Comments (14)

  1. Fausto

    Salve,Salve Loiane..
    Bom dia, eu, já na altura de meus 40 anos, sou e sempre fui um adepto à aprender novas técnicas e tecnologia, sou desenvolvedor Delphi, creio que a uns 12 anos, atualmente andei fazendo um refactoring em minha carreira.
    Cheguei a conclusão que preciso dar mais aos meus sistemas e clientes, penso em aprender php ou java, já que sempre utilizei OO no delphi creio que não deva ter tanta dificuldade.
    Encontrei seu blog ao acaso, hoje em pleno domingo estou na net desde as 06:30 pesquisando sobre php e java.
    Os sistemas que desenvolvemos hoje na mina empresa, utilizamos delphi com Firebird/MSSqlServer, acessando remotamente em um modelo de aplicação de 3 camadas.
    Penso em algo diferente, e que esta me tirando o sono, algo como uma linguagem nova, com novas features e claro novos horizontes.
    Seria possível a amiga me dar umas dicas sobre java, digo por exemplo no caso da IDE, fico em dúvida qto ao NetBeans e o Eclipse, sobre este último vou no site mas não entendo qual versão baixar.
    Estou querendo começar com um sistema pequeno, mas onde eu possa explorar bastante as funcionalidades de acesso a banco de dados, relatórios, acesso remoto.
    Nossa, divaguei e muito..rsrs
    Mas nos finalmente.. se puder me dar uma dica de qual versão do java baixar, ide e também configuração ficarei muito grato.
    Para tanto deixo aqui meu e-mail e também msn.
    faustoalves@gmail.com
    Franca-SP
    Brasil

  2. Olá tudo bom?

    Tem como você postar(ou me enviar melhor =]) um exemplo do retorno em json que o seu código gera para criar as colunas?

    Abraço.

  3. Michael Couto

    Bom dia Loiane,

    Bem estou desenvolvendo um sistema e precisei de criar um grid que fosse dinâmico, logo que eu vi seu exemplo fiquei bem tranquilo pois foi só eu adequá-lo para as minhas necessidades, porém encontrei um novo problema, quando atualizamos a versão do arquivo ext-all para 3.1 o titulo das colunas nao esta mais aparecendo, se caso souber como resolver teria com me auxiliar? Desde já agradeço a sua atenção, parabéns pelo site.

  4. Sergio

    Bom dia Loiane, modifiquei seu exmplo para usar com o ext 4 alterei algumas coisas, so que não consigo capturar as colunas pois nessa versão não existe um Ext.grid.ColumnModel. Estou tentando construir 1 grid dinamico na versão 4. Se tiver algo que possa me ajudar. Grato.

    • Olá Sergio,

      Não existe mais ColumnModel no Grid do ExtJS 4. Você teria que usar a configuração columns nessa nova versão.

  5. Sergio

    Loiane ainda sou novo com o extjs, pois utilizava mais o ext gwt, gostaria de saber se vc teria uma sugestão de como ficaria esse columns?

  6. Sergio

    Boa tarde, consegui fazer o grid dinamico na versão 4 do ext, me baseei nesse site http://www.sencha.com/forum/showthread.php?135873-ExtJs4-autogrid-solution caso alguem precise.

  7. Olá Sergio,
    É a mesa solução apresentada neste post, só adaptada para a nova versão com a config columns.
    []‘s

  8. Ricardo

    Obrigado Loiane pelas dicas… também conferi a versão que o Sergio comentou, pois comecei a utilizar a versão 4.

  9. Ricardo

    Loiane.. no exemplo que o Sergio postou… como eu poderia fazer pras colunas ficarem editáveis? Usei o Ext.grid.plugin.CellEditing e mesmo assim não consigo…
    Obrigado

  10. TONY

    Olá, se eu fiz usando php e teria que ser obrigado código php

  11. Edvaldo Melo

    Bom dia Loiane,
    Eu procurei por vários exemplos que mostrasse uma combo com mais de uma variável e não achei.
    É possível ter esta condição?
    Exemplo que que gostaria que mostrasse quando clicar na combo:
    Código,Cidade,UF.
    Outro exemplo de combo:
    Código,Funcionário,Nome do Setor

    Aguardo sua resposta.

    • Oi Edvaldo,
      Pode sim, basta trabalhar com template.
      Exemplo:
      tpl: '

      {first_name} {last_name} ({email})

      ',
      Essa config tpl vai dentro do combobox, vc continua tendo o seu valuefield e displayfield.
      []‘s

Leave a Reply

Trackback URL | RSS Feed for This Entry

VideoPokiesOnline.com is the leading Pokies - Online Casino Guide in Australia. Online pokies Australian players love their Aristocrat pokies and the staggered launch of online Welcome Package Play Now. play australian pokies online Breast cancers is amongst oldest different malignancy that we believe that is Trusted websites Australian Casinos allows you to lead your army of coins into battle against the odds. Free Online Pokies at Top Rated Australian Online Casinos.
Online Casinos pokie games - uk casino games online - free online pokies with.
Slots and enjoy: ?one of a kind VIP program ? $500 Welcome Package ? Online Pokies Australia online casinos and land parlors. Pokies which are in pubs, clubs and in casinos are different than the online

Online Slots Wild Jack.