Como Montar um Grid utilizando Ext JS
Posted by Loiane | Posted in Ext JS | Posted on 17-06-2009
8
O post Começando com Ext JS mostrou como configurar sua aplicação para começar a trabalhar com Ext JS.
O post de hoje tem como objetivo introduzir como apresentar dados ao usuário utilizando o widget grid da biblioteca Ext JS.
O grid, é sem sombra de dúvidas, um dos componentes mais utilizados do Ext JS. Quando temos um conjunto de dados e temos que apresentá-los ao usuário, uma maneira simples e clara de fazer isso é através de um grid (tabela, planilha). A biblioteca Ext JS já possui um componente que facilita a montagem desses dados em forma de grid.
Para montar esse grid com Ext JS, utilizamos dois componentes:
- Um Store que atua como um banco de dado em memória, com os dados que queremos disponibilizar na tela;
- Um Grid Panel que fornece uma maneira para apresentar os dados armazenados no store.
Terminologia utilizada:
- Columns: refere-se a uma coluna de dados, e pode conter informações relevantes de como exibir a coluna (seus dados e o cabeçalho, inclusive). No Ext JS, essa informação faz parte do componente ColumnModel.
- Fields: também refere-se a uma coluna e seus dados, porém, refere-se aos valores da coluna. No Ext JS é utilizada no reader, para carregar os valores dos dados.
Antes de começarmos, o projeto deve estar configurado para o uso do Ext JS. Você pode ver como configurar aqui.
Vamos começar a montar o nosso primeiro grid em Ext JS.
Fazendo o setup do data store
A primeira coisa que precisamos fazer é coletar os dados que vão ser exibidos no grid. Os tipos de data store disponíveis no Ext JS nos possibilita ler dos dados armazenados em vários formatos, como XML e utilizando JSON. Entre os data store disponíveis por padrão, têm-se:
- Dados simples (array)
- XML
- JSON
Adicionando os dados no data store
Neste primeiro exemplo (do post de hoje), vou utilizar um data store que obtém os dados de um array simples, que representa uma agenda, com nome, telefone, email e data de aniversário dos contatos:
//array contendo os dados que serão exibidos no grid var myData = [ ['Maria','11-12345678','maria@provedor.com','01/02/1984'], ['Pedro','12-55698745','pedro@provedor.com','12/04/1983'], ['João','21-78542359','joao@provedor.com','23/05/1986'], ['Tiago','27-25854567','tiago@provedor.com','07/01/1982'], ['Carla','33-31595187','carla@provedor.com','30/10/1984'], ['Estela','21-98652938','estela@provedor.com','29/06/1985'], ['Lucas','71-87241548','lucas@provedor.com','25/11/1984'], ['Mariana','85-33984526','mariana@provedor.com','02/12/1983'] ];
O data store precisa de duas coisas: os dados em si, e uma descrição dos dados, que chamamos de fields:
//data store que lê os dados e possui sua descrição - fields
var store = new Ext.data.SimpleStore({
fields: [
'nome',
'telefone',
'email',
{name: 'aniversario', type: 'date', dateFormat: 'd/m/Y'}
]
});
Definindo os dados no data store
O reader precisa saber quais são os campos/fields que deve ler como dados para o data store, então vamos defini-los.
Os fields são definidos utilizando um array de objetos, ou se for apenas string que vamos ler, podemos apenas especificar o nome do campo. Todos os campos, exceto o campo aniversário (data), podem ser definidos apenas com o nome do campo. Por exemplo, para o campo nome, podemo definir um objeto assim:
{name: 'nome', type: 'string'}
Entretanto, por estarmos lendo apenas uma string, podemos simplificar definindo o campo nome apenas assim:
'nome'
O campo aniversário é um pouco diferente, porque queremos tratá-lo como um tipo data. Para um campo do tipo ‘date’, existem várias opções para definir o formato da data, e o o atributo dateFormat que precisa ser definido. Se você já trabalha com PHP, estes formatos de data são bem familiares, pois o Ext JS utiliza a mesma formatação para datas que o PHP usa.
{name: 'aniversario', type: 'date', dateFormat: 'd/m/Y'}
O Ext JS possui alguns tipos de dados definidos:
- string
- int (utiliza a função parseInt do javascript)
- float (utiliza a função parseFloat do javascript)
- boolean (true/false)
- date (necessita configuar o atributo de configuração dateFomart)
Exibindo o GridPanel
Até agora definimos apenas os dados que serão exibidos pelo grid. O componente que “junta tudo” é o GridPanel, que é responsável por posicionar os dados em colunas e linhas, adicionar o header/cabeçalho, e empacotar tudo e exibir para o usuário.
// cria o grid
var grid = new Ext.grid.GridPanel({
store: store,
columns: [
{header: "NOME", width: 170, sortable: true, dataIndex: 'nome'},
{header: "TELEFONE", width: 150, sortable: true, dataIndex: 'telefone'},
{header: "EMAIL", width: 150, sortable: true, dataIndex: 'email'},
{header: "DATA NASC.", width: 100, sortable: true, dataIndex: 'aniversario',
renderer: Ext.util.Format.dateRenderer('d/m/Y')}
],
title: 'Grid Simples Extjs',
height:230,
width:590,
renderTo: document.body,
frame:true
});
Mas como o grid funciona?
O nosso data store é passado para o grid que possui um modelo de colunas que determina como as colunas e o cabeçalho serão exibidos. Este modelo é diferente dos fields definidos no reader, que definia como o reader deveria ler os dados.
O GridPanel possui alguns atributos que precisam ser configurados:
- renderTo: onde o grid deve ser exibido.
- frame: apenas adiciona uma borda em volta do grid
- height and width: tamanho da altura e largura do grid em pixels
- store: os dados que serão exibidos
- columns: definido pelo componente ColumnModel. É um array de objetos que definem as colunas do grid
- title: título do grid. Se não for definido, aparece apenas o grid
Configurando o ColumnModel do GridPanel
Para definir as colunas do grid, precisamos criar um array de objetos que definem como essas colunas serão exibidas e tratadas.
O objeto que define cada coluna por ter várias configurações, mas no mínimo requere que o header e o dataIndex estejam definidos. O atributo header define apenas o texto que irá aparecer no cabeçalho. O atributo dataIndex indica qual campo/field será usado para a coluna.
Você também pode conferir alguns outras opções de configuração do ColumnModel:
- sortable: indica se é permitido fazer a ordenação da coluna
- width: o tamanho inidical da coluna em pixels
- hidden: true se não deseja exibir a coluna
- align: alinhamento do texto
- renderer: utilizada para formatar o dado. Qualquer tipo de dado pode ser transformado. Você utilizar as funções de formatação prontas do Ext JS ou criar uma função.
Resultado
Juntando todo o código que fizemos, temos o seguinte resultado no browser:

O código completo desse post você pode fazer o download aqui (formato projeto Eclipse)
E se ainda não sabe como fazer para importar o projeto no eclipse e executar, pode conferir aqui.
Conclusão:
Viu como é fácil e pouco código? Essa biblioteca nos poupa de fazer código braçal para fazer um grid bonitinho assim. ![]()
Passei a última semana estudando o widget de grid e tive um ótimo resultado. Vale a pena, principalmente se você quer poupar tempo ou não gosta muito de javascript puro!
E ainda podemos fazer integração com java e frameworks como Spring e Struts. Assim, podemos fazer toda a parte da lógica de negócio com java e utilizar a biblioteca para deixar a interface mais rica e mais bonita para o usuário.
Referências:
- Documentação Ext JS
- Ext JS samples
- Learning Ext JS
Até a próxima!



Bom trabalho, artigo bem didático
Hey, nice post, very well written. You should blog more about this.
Muito bom o artigo!!
Parabéns! Estarei divulgando por meio do meu blog e colocando os créditos totais ao seu excelente trabalho, simples e preciso!
[...] post Como Montar um Grid utilizando Ext JS, citei que era possível carregar os dados de um grid através de JSON. O post de hoje tem como [...]
[...] primeiro exemplo de grid utilizando Ext JS, foi utilizado um array simples para popular a tabela. Porém, pode ser que alguma aplicação [...]
[...] exemplo: Você tem um grid com o id “id_meu_grid“. Basta abrir a página que contém o componente (neste caso, o [...]
Oi Loiane, gostaria de tirar duas dúvidas. Fiz uma Grid com extjs e quando a data esta zerada no BD [0000-00-00] no browser aparece como 30/11/1899. Como configuro para aparecer zerada, creio que em algum lugar há uma configuração de data mais antiga. 2- Poderia fazer um passo a passo sobre como criar uma grid com rowexpander + BD Mysql. Belo artigo este seu, muito bom….
Muito bom seu artigo, mesmo!
Se poder me ajudar!
Eu montei o grid, jóia! Funciona perfeitamente, poreém, de 7 colunas, 3 são de valores monetários, preciso alinhar o título da coluna e o conteúdo à direita. Como faço isso? Têm alguma propriedade para setar na montagem das colunas?!
Obrigada!