SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
Café com TOM:
   Ext JS 4
     Loiane Groner
        @loiane
   http://loiane.com
http://sencha.com
Cross Browser
         Funciona até
          no IEca 6!




         Não precisa
              ficar
         esquentando
           a cabeça!
Fácil
Integração
Pode integrar código!




E outros....
Contruindo
aplicações ExtJS
Como organizar
 um projeto JS?
ExtJS 3


4k linhas
de código
Difícil de testar

Difícil de manter

Difícil de trabalhar em equipe

Difícil de entender
Trabalho em Equipe


Pessoas diferentes == trabalho
diferente

É preciso usar um padrão
Código precisa ser organizado

Boas práticas precisam ser seguidas

Evitar confusão com versão de
controle
Model View Controller == MVC
Model


Carrega e Gerencia dados da app

Dados dos requests da View
View

Gerencia a visualização dos dados

Componentes UI
Controller


Gerencia inputs do usuário

Atualiza o Model e View
Model
View
View
Controller
Benefícios do MVC

Escalabilidade

Mantenabilidade

Flexibilidade
Estrutura dos Arquivos
Model

Ext.define('Egenial.model.Contato', {
    extend: 'Ext.data.Model',
    fields: ['id', 'nome', 'phone', 'email']
});
Ext.define('Egenial.store.Contatos', {
           extend: 'Ext.data.Store',
           model: 'Egenial.model.Contato',
           autoLoad: true,
           pageSize: 35,
           autoLoad: {start: 0, limit: 35},

              proxy: {
                  type: 'ajax',
                  api: {
                       read : 'contato/listar.action',
                       create : 'contato/criar.action',
                       update: 'contato/update.action',

Store             },
                       destroy: 'contato/delete.action'

                  reader: {
                       type: 'json',
                       root: 'data',
                       successProperty: 'success'
                  },
                  writer: {
                       type: 'json',
                       writeAllFields: true,
                       encode: false,
                       root: 'data'
                  }
              }
        });
Ext.define('Egenial.view.contato.Grid' ,{
   extend: 'Ext.grid.Panel',
   alias : 'widget.contatogrid',

   requires: ['Ext.toolbar.Paging'],

   iconCls: 'icon-grid',

   title : 'Contatos',
   store: 'Contatos',

   columns: [{
         header: "NOME",
                                            View - Grid
         width: 170,
         flex:1,
         dataIndex: 'nome'
     },{
         header: "TELEFONE",
         width: 160,
         flex:1,
         dataIndex: 'phone'
     },{
         header: "EMAIL",
         width: 170,
         flex:1,
         dataIndex: 'email'
     }],
initComponent: function() {

          this.dockedItems = [{
              xtype: 'toolbar',
              items: [{
                  iconCls: 'icon-save',
                  itemId: 'add',
                  text: 'Adicionar',
                  action: 'add'
              },{
                  iconCls: 'icon-delete',
                                                 View - Grid
                  text: 'Excluir',
                  action: 'delete'
                                                 Parte 2
              }]},{
                  xtype: 'pagingtoolbar',
                  dock:'top',
                  store: 'Contatos',
                  displayInfo: true,
                  displayMsg: 'Mostrando Contatos {0} - {1} de {2}',
                  emptyMsg: "Nenhum contato encontrado."
          }];

          this.callParent(arguments);
      }
});
Ext.define('Egenial.view.contato.Formulario', {
                 extend: 'Ext.window.Window',
                 alias : 'widget.contatoform',

                 requires: ['Ext.form.Panel','Ext.form.field.Text'],

                 title : 'Editar/Criar Contato',
                 layout: 'fit',
                 autoShow: true,
                 width: 280,

                 iconCls: 'icon-user',

                 initComponent: function() {
                     this.items = [{
                           xtype: 'form',
                           padding: '5 5 0 5',
                           border: false,
                           style: 'background-color: #fff;',



View - Form
                             fieldDefaults: {
                                 anchor: '100%',
                                 labelAlign: 'left',
                                 allowBlank: false,
                                 combineErrors: true,
                                 msgTarget: 'side'
                             },

                             items: [{
                                 xtype: 'textfield',
                                 name : 'id',
                                 fieldLabel: 'id',
                                 hidden:true
                             },{
                                 xtype: 'textfield',
                                 name : 'nome',
                                 fieldLabel: 'Nome'
                             },{
                                 xtype: 'textfield',
                                 name : 'phone',
                                 fieldLabel: 'Telefone'
                             },{
                                 xtype: 'textfield',
                                 name : 'email',
                                 fieldLabel: 'Email'
                             }]
                       }];
this.dockedItems = [{
                            xtype: 'toolbar',
                            dock: 'bottom',
                            id:'buttons',
                            ui: 'footer',
                            items: ['->', {
                                iconCls: 'icon-save',

View - Form                     itemId: 'save',
                                text: 'Salvar',
                                action: 'save'

Parte 2                     },{
                                iconCls: 'icon-reset',
                                text: 'Cancelar',
                                scope: this,
                                handler: this.close
                            }]
                        }];

                        this.callParent(arguments);
                    }
              });
Controller
Ext.define('Egenial.controller.Contatos', {
   extend: 'Ext.app.Controller',

   stores: ['Contatos'],

   models: ['Contato'],

   views: ['contato.Formulario', 'contato.Grid'],

   refs: [{
      ref: 'contatoPanel',
      selector: 'panel'
    },{
      ref: 'contatogrid',
      selector: 'contatogrid'
    }],
Relação controller -> view

view -> eventos -> controller
        init: function() {
            this.control({
                 'contatogrid dataview': {
                     itemdblclick: this.editarContato
                 },
                 'contatogrid button[action=add]': {
                     click: this.editarContato
                 },
                 'contatogrid button[action=delete]': {
                     click: this.deleteContato
                 },
                 'contatogrid button[action=save]': {
                     click: this.updateContato
                 }
             });
        },
editarContato: function(grid, record) {
    var edit = Ext.create('Egenial.view.contato.Formulario').show();

     if(record){
         edit.down('form').loadRecord(record);
     }
},
updateContato: function(button) {
    var win     = button.up('window'),
    form    = win.down('form'),
    record = form.getRecord(),
    values = form.getValues();


     if (values.id > 0){
         record.set(values);
     } else{
         record = Ext.create('Egenial.model.Contato');
         record.set(values);
         record.setId(0);
         this.getContatosStore().add(record);
     }

     win.close();
     this.getContatosStore().sync();
},
deleteContato: function(button) {

    var grid = this.getContatogrid(),
    record = grid.getSelectionModel().getSelection(),
    store = this.getContatosStore();

    store.remove(record);
    this.getContatosStore().sync();
}
app.js
   Ext.application({
       name: 'Egenial',

         controllers: [
               'Contatos'
         ],

         launch: function() {
             Ext.create('Ext.container.Viewport', {
                layout: 'fit',
                items: [{
                    xtype: 'contatogrid'
                }]
            });
         }
   });
Código Fonte p/ Download
 https://github.com/loiane/
    cafe-com-tom-extjs4
Para saber mais:
Curso Gratuito ExtJS 4
http://loiane.com
Para saber mais:


                   http://amzn.com/
                   1849516669


                   http://
                   www.packtpub.com/
                   ext-js-4-first-look/
                   book
contato = {
  email: ‘contato@loiane.com’,
  blogPtBr: ‘loiane.com’,
  blogIngles: ‘loianegroner.com’,
  twitter: ‘@loiane’,
  github: ‘loiane’
}

           Obrigada!
http://www.egenial.pro/pt/cafecomtom

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

ORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernateORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernate
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
jQuery na Prática!
jQuery na Prática!jQuery na Prática!
jQuery na Prática!
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Java script aula 06 - dom
Java script   aula 06 - domJava script   aula 06 - dom
Java script aula 06 - dom
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
14 patterns-curso gxxbr
14 patterns-curso gxxbr14 patterns-curso gxxbr
14 patterns-curso gxxbr
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
jQuery Simplificando o JavaScript
jQuery Simplificando o JavaScriptjQuery Simplificando o JavaScript
jQuery Simplificando o JavaScript
 
Programação Web com jQuery
Programação Web com jQueryProgramação Web com jQuery
Programação Web com jQuery
 
Minicurso de jQuery
Minicurso de jQueryMinicurso de jQuery
Minicurso de jQuery
 
Jquery a technical overview
Jquery a technical overviewJquery a technical overview
Jquery a technical overview
 
Fugindo das armadilhas do MVC
Fugindo das armadilhas do MVCFugindo das armadilhas do MVC
Fugindo das armadilhas do MVC
 
Escrevendo plugins JQuery
Escrevendo plugins JQueryEscrevendo plugins JQuery
Escrevendo plugins JQuery
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
31/08/2019 - Flutter Talks
31/08/2019 - Flutter Talks31/08/2019 - Flutter Talks
31/08/2019 - Flutter Talks
 
Persistência com JPA e Hibernate
Persistência com JPA e HibernatePersistência com JPA e Hibernate
Persistência com JPA e Hibernate
 
Programação Web com jQuery
Programação Web com jQueryProgramação Web com jQuery
Programação Web com jQuery
 
Criando controle de acesso com php e my sql
Criando controle de acesso com php e my sqlCriando controle de acesso com php e my sql
Criando controle de acesso com php e my sql
 

Destaque

BeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGapBeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGapLoiane Groner
 
QConSP 2012: CSS3 com Sass e Compass
QConSP 2012: CSS3 com Sass e CompassQConSP 2012: CSS3 com Sass e Compass
QConSP 2012: CSS3 com Sass e CompassLoiane Groner
 
JavaOne Brazil 2015: Java e HTML5
JavaOne Brazil 2015: Java e HTML5JavaOne Brazil 2015: Java e HTML5
JavaOne Brazil 2015: Java e HTML5Loiane Groner
 
QConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile MultiplataformaQConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile MultiplataformaLoiane Groner
 
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridasFrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridasLoiane Groner
 
JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3
JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3
JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3Loiane Groner
 
Linguagil 2012: Desenvolvendo Aplicações RIA com Ext JS 4 e Touch 2
Linguagil 2012: Desenvolvendo Aplicações RIA com  Ext JS 4 e Touch 2Linguagil 2012: Desenvolvendo Aplicações RIA com  Ext JS 4 e Touch 2
Linguagil 2012: Desenvolvendo Aplicações RIA com Ext JS 4 e Touch 2Loiane Groner
 
Mulheres da Tecnologia da Informação - Techinter
Mulheres da Tecnologia da Informação - TechinterMulheres da Tecnologia da Informação - Techinter
Mulheres da Tecnologia da Informação - TechinterLoiane Groner
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT)
Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT) Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT)
Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT) Loiane Groner
 
School of Net Webinar: ExtJS 4
School of Net Webinar: ExtJS 4School of Net Webinar: ExtJS 4
School of Net Webinar: ExtJS 4Loiane Groner
 
TDC2013: ExtJS 4: Dicas e Melhores Practicas
TDC2013: ExtJS 4: Dicas e Melhores PracticasTDC2013: ExtJS 4: Dicas e Melhores Practicas
TDC2013: ExtJS 4: Dicas e Melhores PracticasLoiane Groner
 
JavaCE Conference - Ext GWT - GXT 3
JavaCE Conference - Ext GWT - GXT 3JavaCE Conference - Ext GWT - GXT 3
JavaCE Conference - Ext GWT - GXT 3Loiane Groner
 
Curso XML - IBM Academic Initiative
Curso XML - IBM Academic InitiativeCurso XML - IBM Academic Initiative
Curso XML - IBM Academic InitiativeLoiane Groner
 
DevInCachu 2012 LT: Ext Gwt 3: GXT 3
DevInCachu 2012 LT: Ext Gwt 3: GXT 3DevInCachu 2012 LT: Ext Gwt 3: GXT 3
DevInCachu 2012 LT: Ext Gwt 3: GXT 3Loiane Groner
 
FAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaFAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaLoiane Groner
 
WebBr 2013: Apps Mobile Multiplataforma e OpenSource com Sencha Touch e Phon...
WebBr 2013: Apps Mobile Multiplataforma e OpenSource com  Sencha Touch e Phon...WebBr 2013: Apps Mobile Multiplataforma e OpenSource com  Sencha Touch e Phon...
WebBr 2013: Apps Mobile Multiplataforma e OpenSource com Sencha Touch e Phon...Loiane Groner
 
FrontInFloripa 2013: Sencha Touch 2 e Phonegap
FrontInFloripa 2013: Sencha Touch 2 e PhonegapFrontInFloripa 2013: Sencha Touch 2 e Phonegap
FrontInFloripa 2013: Sencha Touch 2 e PhonegapLoiane Groner
 
MobileConf 2015: Desmistificando o Phonegap (Cordova)
MobileConf 2015: Desmistificando o Phonegap (Cordova)MobileConf 2015: Desmistificando o Phonegap (Cordova)
MobileConf 2015: Desmistificando o Phonegap (Cordova)Loiane Groner
 

Destaque (20)

BeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGapBeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGap
 
QConSP 2012: CSS3 com Sass e Compass
QConSP 2012: CSS3 com Sass e CompassQConSP 2012: CSS3 com Sass e Compass
QConSP 2012: CSS3 com Sass e Compass
 
JavaOne Brazil 2015: Java e HTML5
JavaOne Brazil 2015: Java e HTML5JavaOne Brazil 2015: Java e HTML5
JavaOne Brazil 2015: Java e HTML5
 
QConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile MultiplataformaQConSP 2012: Sencha Touch 2: Mobile Multiplataforma
QConSP 2012: Sencha Touch 2: Mobile Multiplataforma
 
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridasFrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
 
JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3
JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3
JustJava 2013: Aplicações Desktop HTML5, CSS3, Javascript com Servlets 3
 
Linguagil 2012: Desenvolvendo Aplicações RIA com Ext JS 4 e Touch 2
Linguagil 2012: Desenvolvendo Aplicações RIA com  Ext JS 4 e Touch 2Linguagil 2012: Desenvolvendo Aplicações RIA com  Ext JS 4 e Touch 2
Linguagil 2012: Desenvolvendo Aplicações RIA com Ext JS 4 e Touch 2
 
Mulheres da Tecnologia da Informação - Techinter
Mulheres da Tecnologia da Informação - TechinterMulheres da Tecnologia da Informação - Techinter
Mulheres da Tecnologia da Informação - Techinter
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT)
Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT) Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT)
Conexao Java 2012: Desenvolvendo RIA com Java e Ext GWT (GXT)
 
School of Net Webinar: ExtJS 4
School of Net Webinar: ExtJS 4School of Net Webinar: ExtJS 4
School of Net Webinar: ExtJS 4
 
TDC2013: ExtJS 4: Dicas e Melhores Practicas
TDC2013: ExtJS 4: Dicas e Melhores PracticasTDC2013: ExtJS 4: Dicas e Melhores Practicas
TDC2013: ExtJS 4: Dicas e Melhores Practicas
 
JavaCE Conference - Ext GWT - GXT 3
JavaCE Conference - Ext GWT - GXT 3JavaCE Conference - Ext GWT - GXT 3
JavaCE Conference - Ext GWT - GXT 3
 
TDC 2011 - Ext JS 4
TDC 2011 - Ext JS 4TDC 2011 - Ext JS 4
TDC 2011 - Ext JS 4
 
Curso XML - IBM Academic Initiative
Curso XML - IBM Academic InitiativeCurso XML - IBM Academic Initiative
Curso XML - IBM Academic Initiative
 
DevInCachu 2012 LT: Ext Gwt 3: GXT 3
DevInCachu 2012 LT: Ext Gwt 3: GXT 3DevInCachu 2012 LT: Ext Gwt 3: GXT 3
DevInCachu 2012 LT: Ext Gwt 3: GXT 3
 
FAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaFAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e Cordova
 
WebBr 2013: Apps Mobile Multiplataforma e OpenSource com Sencha Touch e Phon...
WebBr 2013: Apps Mobile Multiplataforma e OpenSource com  Sencha Touch e Phon...WebBr 2013: Apps Mobile Multiplataforma e OpenSource com  Sencha Touch e Phon...
WebBr 2013: Apps Mobile Multiplataforma e OpenSource com Sencha Touch e Phon...
 
FrontInFloripa 2013: Sencha Touch 2 e Phonegap
FrontInFloripa 2013: Sencha Touch 2 e PhonegapFrontInFloripa 2013: Sencha Touch 2 e Phonegap
FrontInFloripa 2013: Sencha Touch 2 e Phonegap
 
MobileConf 2015: Desmistificando o Phonegap (Cordova)
MobileConf 2015: Desmistificando o Phonegap (Cordova)MobileConf 2015: Desmistificando o Phonegap (Cordova)
MobileConf 2015: Desmistificando o Phonegap (Cordova)
 

Semelhante a Cafe com Tom - ExtJS 4

03_aperfeicoando a interface.pdf
03_aperfeicoando a interface.pdf03_aperfeicoando a interface.pdf
03_aperfeicoando a interface.pdfJoao Neves
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDBRodrigo Hjort
 
Javascript Recuperando Dados De Formularios
Javascript    Recuperando Dados De FormulariosJavascript    Recuperando Dados De Formularios
Javascript Recuperando Dados De Formulariosguestd9e271
 
Curso ExtJS 4 - Aula 01 - Introdução
Curso ExtJS 4 - Aula 01 - IntroduçãoCurso ExtJS 4 - Aula 01 - Introdução
Curso ExtJS 4 - Aula 01 - IntroduçãoLoiane Groner
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosHenrique Gogó
 
jQuery - Visão Geral
jQuery - Visão GeraljQuery - Visão Geral
jQuery - Visão GeralKaio Valente
 
Angular JS, você precisa conhecer
Angular JS, você precisa conhecerAngular JS, você precisa conhecer
Angular JS, você precisa conhecermeet2Brains
 
aula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdfaula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdfBrunoTorres978388
 
Cuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecCuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecMaurício Linhares
 
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...Ezequiel Bertti
 
Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)Makoto Miyagawa
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptLoiane Groner
 

Semelhante a Cafe com Tom - ExtJS 4 (20)

03_aperfeicoando a interface.pdf
03_aperfeicoando a interface.pdf03_aperfeicoando a interface.pdf
03_aperfeicoando a interface.pdf
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
 
Html dom, eventos, jquery
Html dom, eventos, jqueryHtml dom, eventos, jquery
Html dom, eventos, jquery
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
Javascript Recuperando Dados De Formularios
Javascript    Recuperando Dados De FormulariosJavascript    Recuperando Dados De Formularios
Javascript Recuperando Dados De Formularios
 
Curso ExtJS 4 - Aula 01 - Introdução
Curso ExtJS 4 - Aula 01 - IntroduçãoCurso ExtJS 4 - Aula 01 - Introdução
Curso ExtJS 4 - Aula 01 - Introdução
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf
 
jQuery - Visão Geral
jQuery - Visão GeraljQuery - Visão Geral
jQuery - Visão Geral
 
Angular JS, você precisa conhecer
Angular JS, você precisa conhecerAngular JS, você precisa conhecer
Angular JS, você precisa conhecer
 
aula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdfaula09-redux-firebase-auth.pdf
aula09-redux-firebase-auth.pdf
 
Cuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecCuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpec
 
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
 
Interface grafica
Interface graficaInterface grafica
Interface grafica
 
Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Clean code
Clean codeClean code
Clean code
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScript
 

Cafe com Tom - ExtJS 4

  • 1. Café com TOM: Ext JS 4 Loiane Groner @loiane http://loiane.com
  • 3.
  • 4. Cross Browser Funciona até no IEca 6! Não precisa ficar esquentando a cabeça!
  • 8. Como organizar um projeto JS?
  • 10. Difícil de testar Difícil de manter Difícil de trabalhar em equipe Difícil de entender
  • 11. Trabalho em Equipe Pessoas diferentes == trabalho diferente É preciso usar um padrão
  • 12. Código precisa ser organizado Boas práticas precisam ser seguidas Evitar confusão com versão de controle
  • 14. Model Carrega e Gerencia dados da app Dados dos requests da View
  • 15. View Gerencia a visualização dos dados Componentes UI
  • 16. Controller Gerencia inputs do usuário Atualiza o Model e View
  • 17. Model
  • 18. View
  • 19. View
  • 23. Model Ext.define('Egenial.model.Contato', { extend: 'Ext.data.Model', fields: ['id', 'nome', 'phone', 'email'] });
  • 24. Ext.define('Egenial.store.Contatos', { extend: 'Ext.data.Store', model: 'Egenial.model.Contato', autoLoad: true, pageSize: 35, autoLoad: {start: 0, limit: 35}, proxy: { type: 'ajax', api: { read : 'contato/listar.action', create : 'contato/criar.action', update: 'contato/update.action', Store }, destroy: 'contato/delete.action' reader: { type: 'json', root: 'data', successProperty: 'success' }, writer: { type: 'json', writeAllFields: true, encode: false, root: 'data' } } });
  • 25. Ext.define('Egenial.view.contato.Grid' ,{ extend: 'Ext.grid.Panel', alias : 'widget.contatogrid', requires: ['Ext.toolbar.Paging'], iconCls: 'icon-grid', title : 'Contatos', store: 'Contatos', columns: [{ header: "NOME", View - Grid width: 170, flex:1, dataIndex: 'nome' },{ header: "TELEFONE", width: 160, flex:1, dataIndex: 'phone' },{ header: "EMAIL", width: 170, flex:1, dataIndex: 'email' }],
  • 26. initComponent: function() { this.dockedItems = [{ xtype: 'toolbar', items: [{ iconCls: 'icon-save', itemId: 'add', text: 'Adicionar', action: 'add' },{ iconCls: 'icon-delete', View - Grid text: 'Excluir', action: 'delete' Parte 2 }]},{ xtype: 'pagingtoolbar', dock:'top', store: 'Contatos', displayInfo: true, displayMsg: 'Mostrando Contatos {0} - {1} de {2}', emptyMsg: "Nenhum contato encontrado." }]; this.callParent(arguments); } });
  • 27. Ext.define('Egenial.view.contato.Formulario', { extend: 'Ext.window.Window', alias : 'widget.contatoform', requires: ['Ext.form.Panel','Ext.form.field.Text'], title : 'Editar/Criar Contato', layout: 'fit', autoShow: true, width: 280, iconCls: 'icon-user', initComponent: function() { this.items = [{ xtype: 'form', padding: '5 5 0 5', border: false, style: 'background-color: #fff;', View - Form fieldDefaults: { anchor: '100%', labelAlign: 'left', allowBlank: false, combineErrors: true, msgTarget: 'side' }, items: [{ xtype: 'textfield', name : 'id', fieldLabel: 'id', hidden:true },{ xtype: 'textfield', name : 'nome', fieldLabel: 'Nome' },{ xtype: 'textfield', name : 'phone', fieldLabel: 'Telefone' },{ xtype: 'textfield', name : 'email', fieldLabel: 'Email' }] }];
  • 28. this.dockedItems = [{ xtype: 'toolbar', dock: 'bottom', id:'buttons', ui: 'footer', items: ['->', { iconCls: 'icon-save', View - Form itemId: 'save', text: 'Salvar', action: 'save' Parte 2 },{ iconCls: 'icon-reset', text: 'Cancelar', scope: this, handler: this.close }] }]; this.callParent(arguments); } });
  • 29. Controller Ext.define('Egenial.controller.Contatos', { extend: 'Ext.app.Controller', stores: ['Contatos'], models: ['Contato'], views: ['contato.Formulario', 'contato.Grid'], refs: [{ ref: 'contatoPanel', selector: 'panel' },{ ref: 'contatogrid', selector: 'contatogrid' }],
  • 30. Relação controller -> view view -> eventos -> controller init: function() { this.control({ 'contatogrid dataview': { itemdblclick: this.editarContato }, 'contatogrid button[action=add]': { click: this.editarContato }, 'contatogrid button[action=delete]': { click: this.deleteContato }, 'contatogrid button[action=save]': { click: this.updateContato } }); },
  • 31. editarContato: function(grid, record) { var edit = Ext.create('Egenial.view.contato.Formulario').show(); if(record){ edit.down('form').loadRecord(record); } },
  • 32. updateContato: function(button) { var win = button.up('window'), form = win.down('form'), record = form.getRecord(), values = form.getValues(); if (values.id > 0){ record.set(values); } else{ record = Ext.create('Egenial.model.Contato'); record.set(values); record.setId(0); this.getContatosStore().add(record); } win.close(); this.getContatosStore().sync(); },
  • 33. deleteContato: function(button) { var grid = this.getContatogrid(), record = grid.getSelectionModel().getSelection(), store = this.getContatosStore(); store.remove(record); this.getContatosStore().sync(); }
  • 34. app.js Ext.application({ name: 'Egenial', controllers: [ 'Contatos' ], launch: function() { Ext.create('Ext.container.Viewport', { layout: 'fit', items: [{ xtype: 'contatogrid' }] }); } });
  • 35. Código Fonte p/ Download https://github.com/loiane/ cafe-com-tom-extjs4
  • 36. Para saber mais: Curso Gratuito ExtJS 4 http://loiane.com
  • 37. Para saber mais: http://amzn.com/ 1849516669 http:// www.packtpub.com/ ext-js-4-first-look/ book
  • 38. contato = { email: ‘contato@loiane.com’, blogPtBr: ‘loiane.com’, blogIngles: ‘loianegroner.com’, twitter: ‘@loiane’, github: ‘loiane’ } Obrigada!