SlideShare uma empresa Scribd logo
Backbone.js nas trincheiras
                Giovanni Bassi              Osmar Landin
     giovanni@lambda3.com.br osmar.landin@lambda3.com.br
               @giovannibassi               @osmarlandin
Agenda
                 Porque
   O que é                   Estruturando o
              BackboneJS e
 BackboneJS                      projeto
                cenários



  Usando o    Testando o
                              Conclusões
 BackboneJS   BackboneJS
O que é Backbone.js
Backbone.js
• Componente Javascript
  – Pode ser usado com CoffeeScript ou TypeScript
• MV* - Separação de responsabilidades entre modelo,
  view, e roteador (mais ou menos um MVC)
• Um dos frameworks JS mais usados no mundo
• Bem documentado
• Open source (hospedado no github)
Porque Backbone.js?
Características do cenário
BackboneJS x <algum server>
• Prós
  –   Maior responsividade da aplicação
  –   Mais cara de aplicação, menos cara de site
  –   Código de interface concentrado mais perto do navegador
  –   Interfaces mais ricas
• Contras
  – Ferramental ainda em evolução
  – Curva de aprendizado
  – Hoje ainda é mais lento para desenvolver
Cenário
•   Maior responsividade da aplicação
•   Testabilidade
•   Documentação dos componentes
•   Estabilidade dos componentes
•   Rodar na internet e na intranet
•   Navegadores modernos
•   Milhares de usuários
Estruturando o projeto
Separação da IG e comportamento
• Uso do Backbone.js e Mustache.js, depois substituído
  por Handlebars (uma extensão do Mustache)
• Backbone.js provê a ideia de views e templates,
  facilitando a manipulação da view
View
define [
    'Backbone'
    'Handlebars'
    'text!views/templates/AppViewTemplate.html'
],
(Backbone, Handlebars, Template) ->
    class AppView extends Backbone.View

       template: Template

       render: ->
           @$el.html Handlebars.compile(@template)
Template
<section id="eventosApp">
    <header>Eventos</header>
</section>
Consumidor da view
require [
    'views/AppView'
],
(AppView) ->
    appView = new AppView
        el:$("#app-container")
    appView.render()
Separação do código da app e das bibliotecas
• Uso de RequireJS para modularização (usando AMD)
• Separação das pastas da aplicação entre:
  – Bibliotecas
  – Aplicação
  – Testes
Estrutura de diretórios
• Aplicação
   – Scripts (bibliotecas)
   – App (código da aplicação)
      • Models
      • Views
          – Templates
      • Router

   – AppTestes
      • Models
      • Views
RequireJS (html)
<!DOCTYPE html>
<html>
<head>
   <script data-main="App/bootstrap.js" src="Scripts/require.js"></script>
</head>
<body>
    <section id="app-container"></section>
</body>
</html>
RequireJS (Bootstrap)
require.config
    paths:
        jquery: '../Scripts/jquery-1.9.1'
        jQueryUI: '../Scripts/jquery-ui-1.10.0'
        Underscore: '../Scripts/underscore'
        Backbone: '../Scripts/backbone'
        Handlebars: '../Scripts/handlebars'
        TwitterBootstrap: '../Scripts/bootstrap'
        text: '../Scripts/text'
    shim:
        'jQueryUI':
            deps: ['jquery']
        'Handlebars':
            deps: ['jquery']
            exports: 'Handlebars'
RequireJS (módulo)
define [
    'Backbone'
    'Handlebars'
],
(Backbone, Handlebars) ->
Aprofundando no
Backbone.js
Backbone.js não existe sozinho
• Dependência direta do Underscore (ou Lo-Dash)
• Para manipulação da view utiliza jQuery (ou Zepto)
   – Recomendamos também o Handlebars para templates
Roteadores (Backbone.Router)
• Intercepta as urls e encaminha para um método
• Cuida do histórico (back, forward, etc)
• Geralmente só há um roteador na app (grande
  potencial para problemas se você ignorar essa regra)
• Pode ficar bem grande
• Geralmente passa o controle para alguma view
http://localhost/#novo
define ['jquery‘, 'Backbone‘, 'views/AppView‘,
'views/ListaEventosView‘,'views/CadastroEventoView'],
($, Backbone, AppView, ListaEventosView, CadastroEventoView) ->
    class router extends Backbone.Router
        routes:
            '':'home'
            'novo':'criarEvento'
        initialize: ->
            appView = new AppView
                 el:$("#app-container")
            appView.render()
            Backbone.history.start()
        home: ->
            listaEventosView = new ListaEventosView { el:$("#app-content") }
            listaEventosView.render()
        criarEvento: ->
            cadastroView = new CadastroEventoView
                 el:$("#app-content")
            cadastroView.render()
Views
• Não é bem uma view, é mais ou menos um controller
• Em geral busca os dados em algum model ou
  collection, e renderiza o html (com um template ou
  não)
• Intercepta os eventos do html e se comunica com o
  model ou collection, que por sua vez, falam com o
  servidor
View
define ['jquery','Backbone','Handlebars','models/EventosCollection',
'views/ListaEventosItemView','text!views/templates/ListaEventosViewTemplate.html'],
($, Backbone, Handlebars, EventosCollection, ListaEventosItemView, Template) ->
  class ListaEventosView extends Backbone.View
    template: Template
    events: -> 'click #incluir-evento':'criarEvento'
    initialize: (options) ->
      @el = options.el
      @collection = new EventosCollection()
    render: ->
      @$el.empty()
      @$el.html Handlebars.compile @template
      @collection.fetch success: => @renderizarEventos()
    renderizarEventos: ->
      @collection.each (item) =>
        itemView = new ListaEventosItemView {el:$("#listaEventos tbody"), model:item}
        itemView.render()
    criarEvento: -> window.location ='#novo'
Template
<tr>
    <td>{{Id}}</td>
    <td>{{Nome}}</td>
    <td>{{{formataData Data}}}</td>
    <td>{{QuantidadeVagas}}</td>
</tr>
Modelos (Backbone.Model)
• Representam o modelo de negócio, e também os
  dados a serem exibidos/editados
• Tem conexão direta com o servidor, um modelo sabe
  se recuperar no server
• Representam uma única entidade
Model
define [
    'Backbone'
],
(Backbone) ->
    class EventoModel extends Backbone.Model
        idAttribute: "Id"
        urlRoot:"api/eventos"
Coleções (Backbone.Collection)
• Representam uma coleção de entidades do modelo
• Permitem obter diversas entidades de uma única vez,
  com ou sem filtros na consulta
• Permite criar, excluir, atualizar entidades
Collection
define [
    'Backbone'
     'models/EventoModel'
],
(Backbone, EventoModel) ->
    class BackboneCollection extends Backbone.Collection

       url: '/api/eventos'
       model: EventoModel
Testando
Backbone é bastante testável
• Testes de unidade com diversos frameworks possíveis,
  como QUnit, Jasmine e outros (usamos Jasmine com
  Jasmine-JQuery)
• Os testes não batem no server, não há necessidade de
  rodar o lado do servidor para os testes passarem
• Faça testes de unidade!
• Faça também testes de integração dirigindo o browser
Testando a renderização da view
define ['views/ListaEventosItemView'], (ListaEventosItemView) ->
    element = $("<div></div>")
    subject = null
    model = new Backbone.Model()
    model.set
        "Id":7
        "Nome":"Evento 1"
        "Data":"2013-03-14T12:56:59.0934901-03:00"
        "QuantidadeVagas":100
    describe 'Lista Eventos Item View', ->
        beforeEach ->
            subject = new ListaEventosItemView { el:element, model:model }
        describe 'Ao renderizar', ->
            beforeEach ->
                subject.render()
            it 'deve exibir o id do evento', ->
                expect(subject.$el.html()).toContain('7')
            it 'deve exibir o nome do evento', ->
                expect(subject.$el.html()).toContain('Evento 1')
            it 'deve exibir a data do evento já formatada', ->
                expect(subject.$el.html()).toContain('3/14/2013')
Mockando Ajax
describe 'Ao salvar o modelo com sucesso', ->
    beforeEach ->
        spyOn($, "ajax").andCallFake (parametros) ->
            parametros.success
                Id:1
                Nome:"Evento 1"
                Data:"2013-03-14T12:56:59.0934901-03:00"
                QuantidadeVagas:100
it 'deve redirecionar para a listagem de eventos', ->
        $("#salvar", subject.el).click()
        expect(subject.exibirLista).toHaveBeenCalled()
Dúvidas?
           Giovanni Bassi              Osmar Landin
giovanni@lambda3.com.br osmar.landin@lambda3.com.br
          @giovannibassi               @osmarlandin
Obrigado!
           Giovanni Bassi              Osmar Landin
giovanni@lambda3.com.br osmar.landin@lambda3.com.br
          @giovannibassi               @osmarlandin
www.lambda3.com.br

Mais conteúdo relacionado

PDF
Simplificando seu DevOps com o Azure DevOps Project
PPTX
Iac & DevOps no Azure: Automatizando deployments
PPTX
Construindo pipelines com Azure DevOps
PPTX
Microsoft Azure
PDF
Falando sobre DevOps no azure
PDF
Aumentando a produtividade e Automatizando Processos com Jira
PDF
Jboss eap 6
PDF
Principais novidades do Entity Framework 5.0
Simplificando seu DevOps com o Azure DevOps Project
Iac & DevOps no Azure: Automatizando deployments
Construindo pipelines com Azure DevOps
Microsoft Azure
Falando sobre DevOps no azure
Aumentando a produtividade e Automatizando Processos com Jira
Jboss eap 6
Principais novidades do Entity Framework 5.0

Mais procurados (20)

PPTX
Introdução à computação na nuvem e Windows Azure
PPTX
Automatize seu processo de entrega de software com CI/CD na AWS
PPTX
TDC Transformation 2021 - Certificação AZ-900 Azure Fundamental: Conceitos, d...
PDF
Desenvolvendo aplicações móveis na Nuvem
PDF
Spring Boot - Uma app do 0 a Web em 30 minutos
PPTX
Fim do Suporte do Windows Server 2008 e SQL Server 2008
PPTX
Bibliotecas de interface rica no jsf 2
PPTX
DevOps: desenvolvedores e sysadmins cooperando na prática
PPTX
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
PDF
ArcServe in the AWS Cloud - part II
PDF
3. conectando o seu data center de forma segura na aws
PDF
Webinar: Como obter valor comercial com Big Data
PPTX
AWS SUMMIT São Paulo - DEV02 AWS e DevOps - Explore e aproveite o melhor dos ...
PDF
Construindo aplicações Cloud Native em Go
PDF
JHipster - Produtividade e Maturidade em suas mãos
PDF
Rio Cloud Computing Meetup 25/01/2017 - Lançamentos do AWS re:Invent 2016
PPTX
Conta gratuita do Azure
PPTX
Microsoft Azure Fundamentals | Everis - Julho-2021
PDF
Macro Arquitetura de Software
PDF
Azure Bootcamp - Azure App Service e Function com Linux e NodeJS
Introdução à computação na nuvem e Windows Azure
Automatize seu processo de entrega de software com CI/CD na AWS
TDC Transformation 2021 - Certificação AZ-900 Azure Fundamental: Conceitos, d...
Desenvolvendo aplicações móveis na Nuvem
Spring Boot - Uma app do 0 a Web em 30 minutos
Fim do Suporte do Windows Server 2008 e SQL Server 2008
Bibliotecas de interface rica no jsf 2
DevOps: desenvolvedores e sysadmins cooperando na prática
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
ArcServe in the AWS Cloud - part II
3. conectando o seu data center de forma segura na aws
Webinar: Como obter valor comercial com Big Data
AWS SUMMIT São Paulo - DEV02 AWS e DevOps - Explore e aproveite o melhor dos ...
Construindo aplicações Cloud Native em Go
JHipster - Produtividade e Maturidade em suas mãos
Rio Cloud Computing Meetup 25/01/2017 - Lançamentos do AWS re:Invent 2016
Conta gratuita do Azure
Microsoft Azure Fundamentals | Everis - Julho-2021
Macro Arquitetura de Software
Azure Bootcamp - Azure App Service e Function com Linux e NodeJS
Anúncio

Destaque (20)

PDF
I Reubzaet Cinop Oeb 2009v1
PPTX
Has Anyone Asked a Customer?
PDF
Term 4, Week 3, 2010
PDF
T Vs Everywhere Telco Asia 2010
PDF
Most Contagious 2008
PDF
Kic Box Pp
PPTX
Reptiles
PDF
Univ Aizu week10 about computer
 
PPTX
Introdução ao Windows Azure - Sessão 2 (mais prática)
PPT
TIC CONFIDENTIAL
PPTX
MVC and Entity Framework 4
PDF
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
PPTX
Stochastic Neural Network Model: Part 1
PPT
Social Network
PDF
Being the best journalist is not good enough
PPTX
Bedrijfspresentatie Inno2gether
PPT
Laura Devlin
PPT
01 September 2010
PPT
que lindo dia
PPT
IPTV Challenges
I Reubzaet Cinop Oeb 2009v1
Has Anyone Asked a Customer?
Term 4, Week 3, 2010
T Vs Everywhere Telco Asia 2010
Most Contagious 2008
Kic Box Pp
Reptiles
Univ Aizu week10 about computer
 
Introdução ao Windows Azure - Sessão 2 (mais prática)
TIC CONFIDENTIAL
MVC and Entity Framework 4
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
Stochastic Neural Network Model: Part 1
Social Network
Being the best journalist is not good enough
Bedrijfspresentatie Inno2gether
Laura Devlin
01 September 2010
que lindo dia
IPTV Challenges
Anúncio

Semelhante a LambdaDay: Backbone.js (20)

PPTX
Backbone.js nas trincheiras
PDF
Backbone.js - Desenvolvimento de Sistemas Corporativos - UFPB - Campus IV
PDF
Backbone.js
PDF
Backbone.js + Rails - Front-end e back-end conectados
PDF
Backbone.js - A espinha dorsal de aplicações web
PPTX
Introdução ao desenvolvimento front end usando bootstrap e angular js
PDF
JavaScript Model-View no Frontend
ODP
desenvolvimento-web-javascript
PDF
TDC 2015 - Rails & Javascript: faça isso direito
PPTX
Workshop - Ionic + firebase
PDF
Evento Front End SP - Organizando o Javascript
PDF
Introdução ao Desenvolvimento Web com AngularJS - Google I/O Extended Brasília
PPTX
Como desenvolver com um sistema com um front-end colossal?
PDF
AngularJS Abraçando o MVC Client-Side
PDF
ODIG - Javascript, DOM Elements e jQuery
PPTX
KnockoutJS com ASP.NET MVC3: Utilização na vida real
ODP
Dinamizando Sites Estáticos
PPTX
Html dom, eventos, jquery
PPTX
Angular js
Backbone.js nas trincheiras
Backbone.js - Desenvolvimento de Sistemas Corporativos - UFPB - Campus IV
Backbone.js
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js - A espinha dorsal de aplicações web
Introdução ao desenvolvimento front end usando bootstrap e angular js
JavaScript Model-View no Frontend
desenvolvimento-web-javascript
TDC 2015 - Rails & Javascript: faça isso direito
Workshop - Ionic + firebase
Evento Front End SP - Organizando o Javascript
Introdução ao Desenvolvimento Web com AngularJS - Google I/O Extended Brasília
Como desenvolver com um sistema com um front-end colossal?
AngularJS Abraçando o MVC Client-Side
ODIG - Javascript, DOM Elements e jQuery
KnockoutJS com ASP.NET MVC3: Utilização na vida real
Dinamizando Sites Estáticos
Html dom, eventos, jquery
Angular js

Mais de Giovanni Bassi (20)

PPTX
O que aprendi montando a arquitetura de microsserviços
PPTX
Sendo ágil com git
PDF
Analisando dumps de memória de aplicações .NET
PPTX
Novidades do c# 7 e 8
PPTX
Async e await com JavaScript: entenda e use agora
PPTX
Conhecendo o AKS, o azure container services com kubernetes
PPTX
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
PPTX
C#7, 7.1, 7.2, 7.3 e C# 8
PPTX
Engenharia ágil de ponta a ponta do clone ao deploy
PPTX
Entrega contínua fica mais fácil com contêineres
PPTX
.NET Core, ASP.NET Core e .NET Standard 2
PPTX
.NET com contêineres Windows e Linux
PPTX
Async e await com JavaScript: entenda e use agora
PPTX
Compartilhando código entre frontend e backend com Node.js
PPTX
Construindo uma ferramenta CLI multiplataforma com Node.js
PDF
O Futuro do C#: C#8
PDF
Um mergulho nos containers windows
PPTX
Por dentro do .NET Core
PPTX
Build e release pipeline com docker
PPTX
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
O que aprendi montando a arquitetura de microsserviços
Sendo ágil com git
Analisando dumps de memória de aplicações .NET
Novidades do c# 7 e 8
Async e await com JavaScript: entenda e use agora
Conhecendo o AKS, o azure container services com kubernetes
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
C#7, 7.1, 7.2, 7.3 e C# 8
Engenharia ágil de ponta a ponta do clone ao deploy
Entrega contínua fica mais fácil com contêineres
.NET Core, ASP.NET Core e .NET Standard 2
.NET com contêineres Windows e Linux
Async e await com JavaScript: entenda e use agora
Compartilhando código entre frontend e backend com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.js
O Futuro do C#: C#8
Um mergulho nos containers windows
Por dentro do .NET Core
Build e release pipeline com docker
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...

Último (20)

PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Aula sobre desenvolvimento de aplicativos
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PPTX
Aula sobre banco de dados com firebase db
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
PPTX
Aula 18 - Manipulacao De Arquivos python
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
Apple Pippin Uma breve introdução. - David Glotz
Aula sobre desenvolvimento de aplicativos
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Aula sobre banco de dados com firebase db
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Processos na gestão de transportes, TM100 Col18
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Aula 18 - Manipulacao De Arquivos python
Curso de Java 9 - (Threads) Multitarefas.pptx

LambdaDay: Backbone.js

  • 1. Backbone.js nas trincheiras Giovanni Bassi Osmar Landin giovanni@lambda3.com.br osmar.landin@lambda3.com.br @giovannibassi @osmarlandin
  • 2. Agenda Porque O que é Estruturando o BackboneJS e BackboneJS projeto cenários Usando o Testando o Conclusões BackboneJS BackboneJS
  • 3. O que é Backbone.js
  • 4. Backbone.js • Componente Javascript – Pode ser usado com CoffeeScript ou TypeScript • MV* - Separação de responsabilidades entre modelo, view, e roteador (mais ou menos um MVC) • Um dos frameworks JS mais usados no mundo • Bem documentado • Open source (hospedado no github)
  • 6. BackboneJS x <algum server> • Prós – Maior responsividade da aplicação – Mais cara de aplicação, menos cara de site – Código de interface concentrado mais perto do navegador – Interfaces mais ricas • Contras – Ferramental ainda em evolução – Curva de aprendizado – Hoje ainda é mais lento para desenvolver
  • 7. Cenário • Maior responsividade da aplicação • Testabilidade • Documentação dos componentes • Estabilidade dos componentes • Rodar na internet e na intranet • Navegadores modernos • Milhares de usuários
  • 9. Separação da IG e comportamento • Uso do Backbone.js e Mustache.js, depois substituído por Handlebars (uma extensão do Mustache) • Backbone.js provê a ideia de views e templates, facilitando a manipulação da view
  • 10. View define [ 'Backbone' 'Handlebars' 'text!views/templates/AppViewTemplate.html' ], (Backbone, Handlebars, Template) -> class AppView extends Backbone.View template: Template render: -> @$el.html Handlebars.compile(@template)
  • 11. Template <section id="eventosApp"> <header>Eventos</header> </section>
  • 12. Consumidor da view require [ 'views/AppView' ], (AppView) -> appView = new AppView el:$("#app-container") appView.render()
  • 13. Separação do código da app e das bibliotecas • Uso de RequireJS para modularização (usando AMD) • Separação das pastas da aplicação entre: – Bibliotecas – Aplicação – Testes
  • 14. Estrutura de diretórios • Aplicação – Scripts (bibliotecas) – App (código da aplicação) • Models • Views – Templates • Router – AppTestes • Models • Views
  • 15. RequireJS (html) <!DOCTYPE html> <html> <head> <script data-main="App/bootstrap.js" src="Scripts/require.js"></script> </head> <body> <section id="app-container"></section> </body> </html>
  • 16. RequireJS (Bootstrap) require.config paths: jquery: '../Scripts/jquery-1.9.1' jQueryUI: '../Scripts/jquery-ui-1.10.0' Underscore: '../Scripts/underscore' Backbone: '../Scripts/backbone' Handlebars: '../Scripts/handlebars' TwitterBootstrap: '../Scripts/bootstrap' text: '../Scripts/text' shim: 'jQueryUI': deps: ['jquery'] 'Handlebars': deps: ['jquery'] exports: 'Handlebars'
  • 17. RequireJS (módulo) define [ 'Backbone' 'Handlebars' ], (Backbone, Handlebars) ->
  • 19. Backbone.js não existe sozinho • Dependência direta do Underscore (ou Lo-Dash) • Para manipulação da view utiliza jQuery (ou Zepto) – Recomendamos também o Handlebars para templates
  • 20. Roteadores (Backbone.Router) • Intercepta as urls e encaminha para um método • Cuida do histórico (back, forward, etc) • Geralmente só há um roteador na app (grande potencial para problemas se você ignorar essa regra) • Pode ficar bem grande • Geralmente passa o controle para alguma view
  • 21. http://localhost/#novo define ['jquery‘, 'Backbone‘, 'views/AppView‘, 'views/ListaEventosView‘,'views/CadastroEventoView'], ($, Backbone, AppView, ListaEventosView, CadastroEventoView) -> class router extends Backbone.Router routes: '':'home' 'novo':'criarEvento' initialize: -> appView = new AppView el:$("#app-container") appView.render() Backbone.history.start() home: -> listaEventosView = new ListaEventosView { el:$("#app-content") } listaEventosView.render() criarEvento: -> cadastroView = new CadastroEventoView el:$("#app-content") cadastroView.render()
  • 22. Views • Não é bem uma view, é mais ou menos um controller • Em geral busca os dados em algum model ou collection, e renderiza o html (com um template ou não) • Intercepta os eventos do html e se comunica com o model ou collection, que por sua vez, falam com o servidor
  • 23. View define ['jquery','Backbone','Handlebars','models/EventosCollection', 'views/ListaEventosItemView','text!views/templates/ListaEventosViewTemplate.html'], ($, Backbone, Handlebars, EventosCollection, ListaEventosItemView, Template) -> class ListaEventosView extends Backbone.View template: Template events: -> 'click #incluir-evento':'criarEvento' initialize: (options) -> @el = options.el @collection = new EventosCollection() render: -> @$el.empty() @$el.html Handlebars.compile @template @collection.fetch success: => @renderizarEventos() renderizarEventos: -> @collection.each (item) => itemView = new ListaEventosItemView {el:$("#listaEventos tbody"), model:item} itemView.render() criarEvento: -> window.location ='#novo'
  • 24. Template <tr> <td>{{Id}}</td> <td>{{Nome}}</td> <td>{{{formataData Data}}}</td> <td>{{QuantidadeVagas}}</td> </tr>
  • 25. Modelos (Backbone.Model) • Representam o modelo de negócio, e também os dados a serem exibidos/editados • Tem conexão direta com o servidor, um modelo sabe se recuperar no server • Representam uma única entidade
  • 26. Model define [ 'Backbone' ], (Backbone) -> class EventoModel extends Backbone.Model idAttribute: "Id" urlRoot:"api/eventos"
  • 27. Coleções (Backbone.Collection) • Representam uma coleção de entidades do modelo • Permitem obter diversas entidades de uma única vez, com ou sem filtros na consulta • Permite criar, excluir, atualizar entidades
  • 28. Collection define [ 'Backbone' 'models/EventoModel' ], (Backbone, EventoModel) -> class BackboneCollection extends Backbone.Collection url: '/api/eventos' model: EventoModel
  • 30. Backbone é bastante testável • Testes de unidade com diversos frameworks possíveis, como QUnit, Jasmine e outros (usamos Jasmine com Jasmine-JQuery) • Os testes não batem no server, não há necessidade de rodar o lado do servidor para os testes passarem • Faça testes de unidade! • Faça também testes de integração dirigindo o browser
  • 31. Testando a renderização da view define ['views/ListaEventosItemView'], (ListaEventosItemView) -> element = $("<div></div>") subject = null model = new Backbone.Model() model.set "Id":7 "Nome":"Evento 1" "Data":"2013-03-14T12:56:59.0934901-03:00" "QuantidadeVagas":100 describe 'Lista Eventos Item View', -> beforeEach -> subject = new ListaEventosItemView { el:element, model:model } describe 'Ao renderizar', -> beforeEach -> subject.render() it 'deve exibir o id do evento', -> expect(subject.$el.html()).toContain('7') it 'deve exibir o nome do evento', -> expect(subject.$el.html()).toContain('Evento 1') it 'deve exibir a data do evento já formatada', -> expect(subject.$el.html()).toContain('3/14/2013')
  • 32. Mockando Ajax describe 'Ao salvar o modelo com sucesso', -> beforeEach -> spyOn($, "ajax").andCallFake (parametros) -> parametros.success Id:1 Nome:"Evento 1" Data:"2013-03-14T12:56:59.0934901-03:00" QuantidadeVagas:100 it 'deve redirecionar para a listagem de eventos', -> $("#salvar", subject.el).click() expect(subject.exibirLista).toHaveBeenCalled()
  • 33. Dúvidas? Giovanni Bassi Osmar Landin giovanni@lambda3.com.br osmar.landin@lambda3.com.br @giovannibassi @osmarlandin
  • 34. Obrigado! Giovanni Bassi Osmar Landin giovanni@lambda3.com.br osmar.landin@lambda3.com.br @giovannibassi @osmarlandin

Notas do Editor

  • #3: $el = Um objeto Jquery (ou Zepto) cacheado para o elemento da view. Uma referência à mão para não precisar pesquisar o elemento no DOM toda hora
  • #4: AMD - Asynchronous Module DefinitionEspecifica um mecanismo para definição de módulos, de forma que esses módulos e suas referências possam ser carregadas assincronamente.O AMD veio do desejo de ter um formato que fosse melhor que “escrever um monte de tags script com dependências implícitas onde você precisa manualmente pedir”.
  • #5: O atributo data-main é um atributo especial que o RequireJS checará para iniciar o carregamento dos scripts.
  • #6: O jQuery não está especificado no shim porque o jQuery suporta AMD (existe a definição do módulo no arquivo jQury.js)
  • #7: Jasmine-Jquery = é uma extensão do Jasmine (facilita osasserts e a manioulação do HTML, CSS
  • #8: Um SPY faz um mock de qualquer função e rastreia as chamadas a elas e todos os parâmetros/argumentos enviados