| Summary: Um exemplo muito simples de combos dinâmicas para Ext 2 |
| Author: Jozef Sakalos |
| Published: May 15, 2009 |
| Ext Version: 2.0 |
Languages: English Chinese French
|
Contents |
Este é mais um exemplo do que um tutorial, já que é tão simples que apenas precisa de uma breve explicação ao invés de uma abordagem passo-a-passo do procedimento, que partiria do simples para o complexo. O exemplo completo consiste de dois arquivos: lcombo.html e lcombo.js.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="../extjs-2.0/resources/css/ext-all.css"> <script type="text/javascript" src="../extjs-2.0/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="../extjs-2.0/ext-all-debug.js"></script> <script type="text/javascript" src="lcombo.js"></script> <!-- Uma localização do arquivo de script vai aqui --> <script type="text/javascript"> Ext.onReady(LCombo.app.init, LCombo.app); </script> <title>Linked Combos Example</title> </head> <body> </body> </html>
Este é, de fato, o html mínimo para uma aplicação Ext rodar. Não esqueça de trocar as referências para as bibliotecas e recursos Ext de acordo com a sua instalação Ext.
/** * Ext 2.0 Linked Combos Tutorial * by Jozef Sakalos, aka Saki * http://extjs.com/learn/Tutorial:Linked_Combos_Tutorial_for_Ext_2 */ // referência local à imagem em branco Ext.BLANK_IMAGE_URL = '../extjs-2.0/resources/images/default/s.gif'; Ext.namespace('LCombo', 'LCombo.countries', 'LCombo.cities'); LCombo.countries = [ ['USA', 'United States of America'] ,['D', 'Germany'] ,['F', 'France'] ,['GB', 'Great Britain'] ]; LCombo.cities = [ [1, 'USA', 'New York'] ,[2, 'USA', 'Cleveland'] ,[3, 'USA', 'Austin'] ,[4, 'USA', 'Los Angeles'] ,[5, 'D', 'Berlin'] ,[6, 'D', 'Bonn'] ,[7, 'F', 'Paris'] ,[8, 'F', 'Nice'] ,[9, 'GB', 'London'] ,[10, 'GB', 'Glasgow'] ,[11, 'GB', 'Liverpool'] ]; // cria a aplicação LCombo.app = function() { // NÃO acesse DOM a partir daqui; os elementos não existem ainda // variáveis private // funções private // espaço public return { // métodos public init: function() { var form = new Ext.FormPanel({ renderTo:document.body ,width: 400 ,height: 300 ,style:'margin:16px' ,bodyStyle:'padding:10px' ,title:'Linked Combos' ,defaults: {xtype:'combo'} ,items:[{ fieldLabel:'Select Country' ,displayField:'country' ,valueField:'cid' ,store: new Ext.data.SimpleStore({ fields:['cid', 'country'] ,data:LCombo.countries }) ,triggerAction:'all' ,mode:'local' ,listeners:{select:{fn:function(combo, value) { var comboCity = Ext.getCmp('combo-city'); comboCity.clearValue(); comboCity.store.filter('cid', combo.getValue()); }} } },{ fieldLabel:'Select City' ,displayField:'city' ,valueField:'id' ,id:'combo-city' ,store: new Ext.data.SimpleStore({ fields:['id', 'cid', 'city'] ,data:LCombo.cities }) ,triggerAction:'all' ,mode:'local' ,lastQuery:'' }] }); } }; }(); // fim da app // fim do arquivo
Um form com duas combos é criado neste arquivo, com dois pedacinhos de mágica:
O exemplo é extremamente simples e não leva em conta que a lógica interna da ComboBox filtra os registros também. Isso significa que se você começar a digitar na combo cidades, o filtro listener do evento select, definido pela combo países, será primeiramente zerado, e então as letras digitadas são utilizadas para filtrar a combo cidades.
Se você precisa de uma aplicação mais avançada de combos dinâmicas, a melhor maneira é "escutar" o evento beforequery da combo, fazer sua própria lógica de filtragem no evento handler e retornar false para prevenir a execução da query de lógica interna. Utilize o método doQuery da Ext.ComboBox como modelo.