Featured Posts

ExtJS, Spring MVC 3 e Hibernate 3.5: Exemplo de um... Este tutorial demonstra como implementar um CRUD Grid (Create, Read, Update, Delete) usando ExtJS, Spring MVC 3 e Hibernate 3.5 O que geralmente queremos fazer com os dados Create (Criar) - (Insert) Read...

Readmore

ExtJS plugin: PagingToolbarResizer Ei pessoal, Este é o meu primeiro plugin em ExtJS. Apesar de não ser algo complicado, estou muito feliz e é um grande feito para mim! Bem, chega e introduções e vamos ao que realmente interessa. O...

Readmore

8++ perguntas para @loiane - por @hlegius Tempos atrás o Helio me enviou um questionário para eu responder, uma espécie de "entrevista". E agora ele publicou no blog dele! :) São minhas opiniões pessoais, e isso não quer dizer que estou...

Readmore

Carreira em TI: Currículo em Inglês Uma das grandes dificuldades para as pessoas da área de TI é, muitas vezes, escrever um bom currículo em inglês. E ter um currículo em inglês, é essencial, já que inglês é tão importante quanto...

Readmore

Entrevista para o Jornal A Tribuna Jan/2010: Profissões... Na última de semana de janeiro tive a honra de conceder mais uma entrevista para o jornal A Tribuna - vendido no Espírito Santo, meu estado natal - sobre mercado de trabalho na área de TI. A reportagem...

Readmore

Como construir um grid dinâmico utilizando Ext JS

Posted by Loiane | Posted in Ext JS, json | Posted on 30-07-2009

3

É 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:

griddinamicoextjs01

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:

griddinamicoextjs02

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

griddinamicoextjs03

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

griddinamicoextjs04

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:

griddinamicoextjs05

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).

griddinamicoextjs06

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

griddinamicoextjs10

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

griddinamicoextjs07

E o um método para criar os dados:

griddinamicoextjs08

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:

griddinamicoextjs09

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

griddinamicoextjs11

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

griddinamicoextjs12E o resultado é este:

griddinamicoextjs13

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

download

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

Até a próxima!

:)

  • Share/Bookmark

Posts Similares

Comments (3)

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

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.

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.

Write a comment