extjs-4
DESCRIPTION
Introdução Básica a ExtJS4TRANSCRIPT
Sencha ExtJS
Eduardo Mendes ([email protected])
Ext JS
3
Implementação de aplicações ricas para a plataforma Web
Framework JavaScript da Sencha
Possui outras versões, como o Sencha Touch
Baseado em componentes
Grande comunidade de desenvolvedores
Eduardo Mendes ([email protected])4
Eduardo Mendes ([email protected])6
É um Framework FrontEnd
Deve ser utilizado com outras tecnologias para realizar a parte ServerSide
Pode integrar com outros frameworks JS
Até a versão 3 precisa de um adapter, mas agora não é mais necessário
PHPRAILS
SPRINGSTRUTS 2
PYTHON
As informações entre servidor e ExtJS são trocadas por JSON e XML
Eduardo Mendes ([email protected])
Carregamento Dinâmico
8
Ext.Loader.setConfig({ enabled: true }); !
Ext.Loader.setPath(‘Ext.ux’, ‘../ux’); !
Ext.require(…);
Eduardo Mendes ([email protected])
Package Data
9
Ext.Loader.setConfig({ enabled: true }); !
Ext.Loader.setPath(‘Ext.ux’, ‘../ux’); !
Ext.require(…);
Eduardo Mendes ([email protected])
Model Fields
10
Ext.define('User', { extend: 'Ext.data.Model', fields: [ { name: ‘id’, type: 'int'}, {name: 'name', type: 'string'} ] });
Eduardo Mendes ([email protected])
Model Association
11
Ext.define('User', { extend: 'Ext.data.Model', fields: [‘id’,’name’], hasMany: 'Posts' }); !
Ext.define('Post', { extend: 'Ext.data.Model', fields: [‘id’,’user_id’, ‘title’, ‘body’], belongsTo: 'User' });
Eduardo Mendes ([email protected])15
Faça o download do ExtJS no site da Sencha
Eduardo Mendes ([email protected])17
Estruturadocs: contém a documentação completa (que você precisa para implantá-lo em um servidor local para ser capaz de executá-lo) !
exemplos: Este contém exemplos de como usar os componentes Ext JS !
packages: contém os módulos Ext JS, empacotados !
resources: contém o CSS e imagens utilizados pelos temas Ext !
src: código fonte completo !
welcome: contém imagens utilizadas pelo index.html !
builds: arquivos adicionais !
Eduardo Mendes ([email protected])18
Ouvindo o evento ready
Ext.onReady(function(){ <code> });
DOM
"I'm ready"
O código só executará depois que o DOM estiver "pronto"
Eduardo Mendes ([email protected])19
Utilizando ExtJS
dowload ExtJS
carregue-o em seu documento HTML
<script src=“extjs-all.js”></script>
carregue o CSS do ExtJS
<link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" />
1
2
3
Eduardo Mendes ([email protected])20
Exemplo completo<html> <head> !
!
!
!
</head> <body></body> !
!
!
!
!
</html>
<link rel="stylesheet" type="text/css" href="../extjs/resources/css/ext-all.css" />
<script> Ext.onReady(function() { Ext.MessageBox.alert('Hello','Hello, World!'); }); </script>
<script src="../extjs/ext-all.js"></script>
Eduardo Mendes ([email protected])25
Criando um Painel Simples<body> <div id="painelPrincipal"></div> </body>
Ext.onReady(function () { !
!
!
!
!
!
!
!
!
});
renderTo: 'painelPrincipal', !
title: 'Painel ExtJS 4', width: 400, height: 300, frame: true, !
html: "<div id='contentID'></div>"
Ext.create('widget.panel', { !
!
!
!
!
!
!
});
Eduardo Mendes ([email protected])27
Criando um Painel Simples + jQuery Ext.onReady(function () { Ext.create('widget.panel', { renderTo: 'painelPrincipal', !
title: 'Painel ExtJS 4', width: 400, height: 300, frame: true, !
html: "<div id='contentID'></div>" }); $("#contentID").load("conteudo.html"); });
Eduardo Mendes ([email protected])
Definir classes 02 maneiras
30
Ext.define(Nome, configuracoes, callback);
Ext.ClassManager(Nome, configuracoes, callback);
Eduardo Mendes ([email protected])
32
Definindo uma classe Ext.onReady(function () { !
!
!
!
!
!
!
!
!
!
!
!
});
Ext.define('Usuario', { !
!
!
!
!
!
!
!
!
!
});
nome: '', senha: '', login: function() { console.log("Logando na aplicacao..."); }, logout: function() { console.log("Saindo d aplicação...") } },
function() { console.log("Callback acionado"); }
Eduardo Mendes ([email protected])33
SobrescreverExiste um construtor padrão no ExtJS
constructor: function(options){ Ext.apply(this, options || {}); }
Eduardo Mendes ([email protected])
34
Sobrescrevendo o construtorExt.onReady(function () { Ext.define('Usuario', { nome: '', senha: '', !
!
!
login: function() { console.log("Logando na aplicacao..."); }, logout: function() { console.log("Saindo d aplicação...") } }, … });
constructor: function(options) { Ext.apply(this, options || {}); },
Eduardo Mendes ([email protected])
Instanciar um objeto 02 maneiras
35
Ext.create(Nome, opcoes);
Ext.ClassManager.instantiate(Nome, opcoes);
Eduardo Mendes ([email protected])
Instanciar um objeto Usuario
36
var usuario = Ext.create('Usuario');
Eduardo Mendes ([email protected])37
Passando parâmetros
var usuario = Ext.create(‘Usuario’, { nome: ‘Eduardo’, senha: ‘123456’ });
Eduardo Mendes ([email protected])38
Código final Ext.onReady(function () { Ext.define('Usuario', { nome: '', senha: '', ! constructor: function (options) { Ext.apply(this, options || {}); ! console.log("Construtor chamado"); }, login: function () { console.log("Logando na aplicacao..."); }, logout: function () { console.log("Saindo d aplicação...") } }, function () { console.log("Callback acionado"); } ); ! var usuario = Ext.create('Usuario', { nome: 'Eduardo', senha: '123456' }); console.log(usuario); });
Eduardo Mendes ([email protected])39
Refatorando Ext.define('Usuario', { nome: '', senha: '', ! constructor: function (options) { Ext.apply(this, options || {}); ! console.log("Construtor chamado"); }, login: function () { console.log("Logando na aplicacao..."); }, logout: function () { console.log("Saindo d aplicação...") } }, function () { console.log("Callback acionado"); } ); ! Ext.onReady(function () { var usuario = Ext.create('Usuario', { nome: 'Eduardo', senha: '123456' }); console.log(usuario); });
Eduardo Mendes ([email protected])41
HerançaA finalidade de utilizar herança com ExtJS é personalizar os componentes existentes para as necessidades de um sistema específico
Escolha um componente e configure suas propriedades e comportamentos
Eduardo Mendes ([email protected])42
Herdando dos componentes ExtJS
A opção extend permite que se possa herdar e personalizar um componente ExtJS
Ext.define('MyButton', { } );
Ext.onReady(function () { Ext.create("MyButton", { !
!
}); });
O 1.º passo é utilizar o código de definição de uma classe
extend:
É necessário informar o nome completo da classe que se quer herdar
O valor informado deve ser uma String
text: ‘Olá ExtJs', renderTo: Ext.getBody()
'Ext.button.Button'
Eduardo Mendes ([email protected])43
Eduardo Mendes ([email protected])44
Herdando dos componentes ExtJS Ext.define('MyButton', { } );
Ext.onReady(function () { Ext.create("MyButton", { !
!
}); });
extend:
text: ‘Olá ExtJs', renderTo: Ext.getBody()
'Ext.button.Button'
Vamos adicionar à definição da classe a característica e o comportamento
Eduardo Mendes ([email protected])45
Herdando dos componentes ExtJS Ext.define('MyButton', { extend: ‘Ext.button.Button' text: ‘Olá ExtJs', renderTo: Ext.getBody() !
} );
Ext.onReady(function () { Ext.create("MyButton"); });
Essa opção ainda permite que haja sobrescrita de valores
Como fazer para evitar isso?
Eduardo Mendes ([email protected])
Adicionando propriedades finais
46
initComponent: function(){}
this.callParent();
gancho para personalizar a inicialização de um componente
faz uma chamada ao construtor da superclasse imediata
Eduardo Mendes ([email protected])47
Propriedades finais Ext.define('MyButton', { extend: 'Ext.button.Button', initComponent: function() { this.text = "Outra frase"; this.callParent(); } } );
Ext.onReady(function () { Ext.create("MyButton"); });
Eduardo Mendes ([email protected])48
Propriedades finais Ext.define('MyButton', { extend: 'Ext.button.Button', initComponent: function() { this.text = "Outra frase"; this.callParent(); } } );
Ext.onReady(function () { Ext.create("MyButton", { text: 'Olá ExtJS', renderTo: Ext.getBody() }); });
Eduardo Mendes ([email protected])49
Reaproveitando o componente
<body> <section id="opcao1"></section> <section id="opcao2"></section> <section id="opcao3"></section> </body>
Eduardo Mendes ([email protected])50
Reaproveitando o componente Ext.onReady(function () { Ext.create("MyButton", { renderTo: 'opcao1' }); !
Ext.create("MyButton", { renderTo: 'opcao2' }); !
Ext.create("MyButton", { renderTo: 'opcao3' }); !
});
<body> <section id="opcao1"></section> <section id="opcao2"></section> <section id="opcao3"></section> </body>
Eduardo Mendes ([email protected])52
MixinsDefinem um conjunto de comportamentos e configurações reutilizáveis que podem ser mixadas a uma classe
o 1.º passo é criar uma classe para ser o mixin
Eduardo Mendes ([email protected])53
Mixins
Um mixin pode ter qualquer número de métodos
Uma classe pode utilizar qualquer n.º de mixins
Eduardo Mendes ([email protected])54
Mixins Locavel e Vendivel Ext.define( !
);
‘Exemplo.mixin.Locavel’, { }
alugar: function() { console.log('Imovel está disponível para aluguel!');
Ext.define( !
);
‘Exemplo.mixin.Vendivel’, { }
vender: function() { console.log('Imovel está disponível para venda!');
Eduardo Mendes ([email protected])55
Mixins Locavel e Vendivel Ext.define('Exemplo.mixin.Locavel', { alugar: function() { console.log('Imovel está disponível para aluguel!'); } }); ! Ext.define('Exemplo.mixin.Vendivel', { vender: function() { console.log('Imovel está disponível para comprar!'); } });
Ext.define('Exemplo.imovel.Apartamento', { !
!
!
});
!
mixins: { !
!
}
!
!
alugarApartamento: ‘Exemplo.mixin.Locavel’, !
!
!
!
venderApartamento: ‘Exemplo.mixin.Vendivel’
as chaves podem possuir qualquer valor
Eduardo Mendes ([email protected])56
Mixins Locavel e Vendivel Ext.define('Exemplo.imovel.Apartamento', { mixins: { alugarApartamento: 'Exemplo.mixin.Locavel', venderApartamento: 'Exemplo.mixin.Vendivel' } });
Ext.onReady(function () { !
var meuAp = Ext.create('Exemplo.imovel.Apartamento'); meuAp.alugar(); meuAp.vender(); !
});
Eduardo Mendes ([email protected])58
ConfigCria métodos acessores e modificadores de forma automática, mais utilitários
getter setter reset apply
Eduardo Mendes ([email protected])59
Config
Ext.onReady(function () { Ext.define('Usuario', { nome: '', senha: '', }); });
Eduardo Mendes ([email protected])60
Config
Ext.define('Usuario', { config: { nome: '', senha: ‘', } });
getNome setNome resetNome
getSenha setSenha resetSenha
Eduardo Mendes ([email protected])63
Acionando um MessageBox a partir do botão
Ext.onReady(function() { Ext.create('Ext.Button', { text: 'Saudar a Turma', renderTo: 'botao-saudar', handler: function() { Ext.MessageBox.alert('Saudacao','Ola, Turma!'); } }); });
informa em o id do elemento onde será renderizado
informa a ação que será realizada ao clicar no botão
<p id="botao-saudar"></p>
Eduardo Mendes ([email protected])65
MessageBox + CallbackO 3.º parâmetro é um callback que é executado quando o botão OK é chamado
Ext.onReady(function() { Ext.create('Ext.Button', { text: 'Saudar a Turma', renderTo: 'botao-saudar', handler: function() { Ext.MessageBox.alert('Saudacao','Ola, Turma!'); } }); });
Eduardo Mendes ([email protected])66
MessageBox + CallbackO 3.º parâmetro é um callback que é executado quando o botão OK é chamado
Ext.onReady(function() { Ext.create('Ext.Button', { text: 'Saudar a Turma', renderTo: 'botao-saudar', handler: function() { Ext.MessageBox.alert('Saudacao','Ola, Turma!’, function() { console.log("A turma foi saudada"); } ); } }); });
Eduardo Mendes ([email protected])68
MessageBox + confirmA mensagem de confirmação
Ext.create('Ext.Button', { text: 'Confirmar Aula', renderTo: 'botao-confirmar', handler: function() { Ext.MessageBox.confirm( ‘Confirmacao', 'Confirmar a aula?’, function(btn) { console.log("A aula foi confirmada? R: " + btn); } ); } });
Eduardo Mendes ([email protected])70
MessageBoxA mensagem de confirmacao
Ext.create('Ext.Button', { text: 'Confirmar Aula', renderTo: 'botao-confirmar', handler: function() { Ext.MessageBox.confirm( ‘Confirmacao', 'Confirmar a aula?’, function(btn) { console.log("A aula foi confirmada? R: " + btn); } ); } });
Eduardo Mendes ([email protected])71
MessageBox + confirm + acao!
Ext.MessageBox.confirm( ‘Confirmacao', 'Confirmar a aula?’, function(btn) { console.log("A aula foi confirmada? R: " + btn); if (btn == "yes") { Ext.MessageBox.alert('Confirmada','Ola, …’); } } );
Eduardo Mendes ([email protected])73
MessageBox + PromptO botão de prompt
Ext.create('Ext.Button', { text: 'Prompt', renderTo: 'botao-prompt', handler: function() { Ext.MessageBox.prompt( 'Prompt', 'Qual o horario da aula?', function(btn, text) { console.log("O horario da aula eh: " + text); } ); } });
Eduardo Mendes ([email protected])75
MessageBox + Prompt + multilineO botão de prompt
Ext.create('Ext.Button', { text: 'Prompt', renderTo: 'botao-prompt', handler: function() { Ext.MessageBox.prompt( 'Prompt', 'Qual o horario da aula?', function(btn, text) { console.log("O horario da aula eh: " + text); } ); } });
Eduardo Mendes ([email protected])76
MessageBox + Prompt + multilineO botão de prompt
Ext.create('Ext.Button', { text: 'Prompt-area', renderTo: 'botao-prompt-area', handler: function() { Ext.MessageBox.prompt( 'Prompt', ‘Qual sera o conteudo da aula?', function(btn, text) { console.log("O conteudo da aula eh: " + text); }, this, true ); } });
Eduardo Mendes ([email protected])79
PanelVárias classes no ExtJS são subclasses de Panel como: !
Menu !
Form !
Grid !
Window
Eduardo Mendes ([email protected])
Configurações
81
html items buttons dockedItems layout tools title bars
Eduardo Mendes ([email protected])82
PanelCódigo básico
Ext.onReady(function() { Ext.create('Ext.panel.Panel', { title: 'Ola', width: 200, html: '<p>Turma!</p>', renderTo: Ext.getBody() }); });
Eduardo Mendes ([email protected])83
PanelCódigo básico
Ext.onReady(function() { Ext.create('Ext.panel.Panel', { title: 'Ola', width: 200, height: 300, html: '<p>Turma!</p>', renderTo: Ext.getBody() }); });
Eduardo Mendes ([email protected])
Configurações
84
html items buttons dockedItems layout tools title bars
Eduardo Mendes ([email protected])85
Panel + items
Ext.onReady(function() { Ext.create('Ext.panel.Panel', { bodyPadding: 20, width: 300, title: 'Filters', items: [{ xtype: 'datefield', fieldLabel: 'Data inicial' }, { xtype: 'datefield', fieldLabel: 'Data final' }], renderTo: Ext.getBody() }); });
Eduardo Mendes ([email protected])86
Panel + items + grid
Ext.onReady(function() { Ext.create('Ext.panel.Panel', { bodyPadding: 20, width: 300, title: 'Filters', items: [{ xtype: 'datefield', fieldLabel: 'Data inicial' }, { xtype: 'datefield', fieldLabel: 'Data final' }], renderTo: Ext.getBody() }); });
Eduardo Mendes ([email protected])
Configurações
87
html items buttons dockedItems layout tools title bars
Eduardo Mendes ([email protected])88
Panel + dockedItems Ext.create('Ext.panel.Panel', { bodyPadding: 20, title: 'Filters', width: 300, items: [{ xtype: 'datefield', fieldLabel: 'Data inicial' }, { xtype: 'datefield', fieldLabel: 'Data final' }], dockedItems: [{ xtype: 'toolbar', dock: 'bottom', items: [{ text: 'Encaixado na base' }] }], renderTo: Ext.getBody() });