S.P.A. con Backbone.js

Julien Castelain
Denis Ciccale
Nosotros
Desarrolladores front auto-didactas

• Trabajan en MediaNet Software como UX Technical
  Leaders
• Actualmente usando Backbone.js en un proyecto
  para uno de los 5 bancos más grandes de Europa


                                      J. Castelain, D. Ciccale
                                          MediaNet Software
¿De qué vamos a hablar?
•   Acerca de MediaNet Software
•   Backbone.js & MVC
•   Gestión de recursos
•   Tests Unitarios
•   Conclusiones
•   ¿Preguntas?

                                  J. Castelain, D. Ciccale   3
                                      MediaNet Software
Acerca de MediaNet Software
EMPRESA ESPAÑOLA
 EMPRESA ESPAÑOLA

FUNDADA EN 1995
 FUNDADA EN 1995

TRAYECTORIA DE SPIN-OFFS Y
 TRAYECTORIA DE SPIN-OFFS Y
START-UPS
 START-UPS


                              J. Castelain, D. Ciccale
                                  MediaNet Software
PERFIL DE EMPRESA:
PERFIL DE EMPRESA:


ARTESANÍA:
ARTESANÍA:
CONOCIMIENTO +
CONOCIMIENTO +
EXPERIENCIA
EXPERIENCIA          http://www.flickr.com/photos/24443965@N08/

                                        J. Castelain, D. Ciccale
                                            MediaNet Software
18/03/12                                       194 Medianos - Google Maps




PERFIL DE EMPRESA:
PERFIL DE EMPRESA:


MÁS DE 200 ESPECIALISTAS
MÁS DE 200 ESPECIALISTAS
                                                                                                                       ©2012 Google -

                                      194 Medianos
                                      Publicación restringida · 68 vistas
                                      Creado el 12 de Mar · Por · Actualizado hace 2 días
                                                                                            J. Castelain, D. Ciccale
                                                                                                MediaNet Software
                                      Argentina - Comodoro Rivadavia
UNA CULTURA BASADA EN
UNA CULTURA BASADA EN
LA INNOVACIÓN
LA INNOVACIÓN

UN ENFOQUE CENTRADO
UN ENFOQUE CENTRADO
EN EL PROYECTO
EN EL PROYECTO

                        J. Castelain, D. Ciccale
                            MediaNet Software
NUESTRA FÓRMULA:
NUESTRA FÓRMULA:


COMPROMISO
COMPROMISO
VISIÓN A LARGO PLAZO
VISIÓN A LARGO PLAZO
EQUIPO
EQUIPO
                       J. Castelain, D. Ciccale
                           MediaNet Software
tivo s
                                                    s
                                                  vo
                                          bjje ti
                                             e
                                       e ob
                                         o
                                   n de
                                      d
                              iciió n
                                  ó
                          arttic
                         p r
                      mp a
                    Co m
¿QUÉ HACEMOS?
¿QUÉ HACEMOS?

                    Co
NUESTRAS ÁREAS DE
NUESTRAS ÁREAS DE
ACTIVIDAD
ACTIVIDAD

                                                        J. Castelain, D. Ciccale
                                                            MediaNet Software
Y SOBRE TODO:
Y SOBRE TODO:


LAS PERSONAS SON
LAS PERSONAS SON
SIEMPRE LO PRIMERO
SIEMPRE LO PRIMERO

                     J. Castelain, D. Ciccale
                         MediaNet Software
¿Qué es Backbone.js?
Es una librería que permite estructurar una
aplicación web siguiendo el concepto de MVC




                                J. Castelain, D. Ciccale
                                    MediaNet Software
Otros frameworks MVC




                  J. Castelain, D. Ciccale
                      MediaNet Software
Componentes de Backbone.js




                             J. Castelain, D. Ciccale   15
                                 MediaNet Software
Models
• Representa los datos




                         J. Castelain, D. Ciccale   16
                             MediaNet Software
Models
var User = Backbone.Model.extend({
  defaults: {
       firstName: '',
       lastName: '',
       date: null
  },
  url: '/user'
});


                                     J. Castelain, D. Ciccale   17
                                         MediaNet Software
Models
• Representa los datos
• Notifica de cambios en sus atributos




                                         J. Castelain, D. Ciccale   18
                                             MediaNet Software
Models
• Representa los datos
• Notifica de cambios en sus atributos
• Se comunica con el servidor para estar sincronizado
    •   fetch (GET), save (POST/PUT), destroy (DELETE)




                                          J. Castelain, D. Ciccale   19
                                              MediaNet Software
Models
var user = new User();
user.on('change', function () {
  console.log(user.toJSON());
});
user.fetch(); // GET json
// actualización
user.set({firstName: 'Jeremy', lastName: 'Ashkenas'});
user.save(); // POST/PUT

                                         J. Castelain, D. Ciccale   20
                                             MediaNet Software
Collections
• Conjunto de modelos




                        J. Castelain, D. Ciccale   21
                            MediaNet Software
Collections
var Users = Backbone.Collection.extend({
  model: User, // modelo que usa la colección
  url: '/users' // url que devuelve los datos
});




                                      J. Castelain, D. Ciccale   22
                                          MediaNet Software
Collections
• Conjunto de modelos
• Se comporta como un modelo




                               J. Castelain, D. Ciccale   23
                                   MediaNet Software
Collections
var users = new Users();
users.fetch(); // petición GET a /users
…
console.log(users.models);




                                J. Castelain, D. Ciccale   24
                                    MediaNet Software
Collections
• Conjunto de modelos
• Se comporta como un modelo
• Eventos
   •   add, remove, refresh, reset




                                     J. Castelain, D. Ciccale   25
                                         MediaNet Software
Collections
var users = new Users();
users.on('reset', function () {
  console.log('modelos reemplazados!');
});
users.fetch(); // GET /users



                                J. Castelain, D. Ciccale   26
                                    MediaNet Software
Collections
• Conjunto de modelos
• Se comporta como un modelo
• Eventos
    •   add, remove, refresh, reset
• Fácil manipulación gracias a Underscore.js
    •   forEach (each), map, reduce (foldl, inject), reduceRight (foldr), find (detect), filter (select), reject,
        every (all), some (any), include, invoke, max, min, sortBy, groupBy, sortedIndex, shuffle, toArray,
        size, first, initial, rest, last, without, indexOf, lastIndexOf, isEmpty, chain



                                                                               J. Castelain, D. Ciccale        27
                                                                                   MediaNet Software
Views
• Representación gráfica de los datos
    •   template, initialize, model, render, el




                                                  J. Castelain, D. Ciccale   28
                                                      MediaNet Software
Views
var UserView = Backbone.View.extend({
  template: _.template($('#userView').html()),
  initialize: function () {
       this.render();
  },
  render: function () {
       this.$el.html(this.template(this.model.toJSON()));
       return this;
  }
});
                                                     J. Castelain, D. Ciccale   29
                                                         MediaNet Software
Views
<!-- UserView template -->
<script type="text/template" id="userView">
  <h2>Usuario</h2>
  <p>Nombre: <%= firstName %></p>
  <p>Apellido: <%= lastName %></p>
</script>




                                              J. Castelain, D. Ciccale   30
                                                  MediaNet Software
Views
// instanciamos la vista
var userView = new UserView({model: user});
userView.el.appendTo(document.body);
....
<div>
  <h2>Usuario</h2>
  <p>Nombre: Jeremy</p>
  <p>Apellido: Ashkenas</p>
</div>
                                              J. Castelain, D. Ciccale   31
                                                  MediaNet Software
Views
• Representación gráfica de los datos
    •   template, initialize, model, render, el
• Puede mantenerse sincronizada con el modelo o una
  colección




                                                  J. Castelain, D. Ciccale   32
                                                      MediaNet Software
Views
var UserView = Backbone.View.extend({
  …
  initialize: function () {
      this.model.on('change', this.render, this);
  }
  …
});

                                     J. Castelain, D. Ciccale   33
                                         MediaNet Software
Views
• Representación gráfica de los datos
    •   template, Initialize, model, render, el
• Puede mantenerse sincronizada con el modelo o una
  colección
• Eventos (click, submit...)



                                                  J. Castelain, D. Ciccale   34
                                                      MediaNet Software
Views
var UserView = Backbone.View.extend({
 initialize: function () {
       _.bindAll(this);
 },
 events: {
      'click #button': 'sayHello';
 },
 sayHello: function (event) {
      console.log('hello', this.model.get('firstName'));
 }
});
                                                           J. Castelain, D. Ciccale   35
                                                               MediaNet Software
Templating
• Underscore, Handlebars




                           J. Castelain, D. Ciccale   36
                               MediaNet Software
Templating
<script type="text/template" id="usersView">
   <h2>Usuarios</h2>
   <ul>
   <% _.each(users, function (user) { %>
    <li>Usuario: <%= firstName %>, <%= lastName %></li>
  <% }); %>
   </ul>
</script>

                                           J. Castelain, D. Ciccale   37
                                               MediaNet Software
Templating
<script>
  _.templateSettings = {
   interpolate : /{{(.+?)}}/g
  };
</script>




                                    J. Castelain, D. Ciccale   38
                                        MediaNet Software
Templating
<script type="text/template" id="usersView">
  <h2>Usuarios</h2>
  <ul>
  <% _.each(users, function (user) { %>
    <li>Usuario: {{ firstName }}, {{ lastName }}</li>
  <% }); %>
  </ul>
</script>

                                          J. Castelain, D. Ciccale   39
                                              MediaNet Software
Templating
var UserView = Backbone.View.extend({
  template: Handlebars.compile($('#userView').html()),
  ...
  render: function () {
      this.$el.html(this.template(this.model.toJSON()));
      return this;
  }
});


                                               J. Castelain, D. Ciccale   40
                                                   MediaNet Software
Templating
<script type="text/template" id="usersView">
  <h2>Usuarios</h2>
  <ul>
  {{#each users}}
    <li>Usuario: {{ firstName }}, {{ lastName }}</li>
  {{/each}}
  </ul>
</script>


                                               J. Castelain, D. Ciccale   41
                                                   MediaNet Software
¿M.V…?
Router
• Controla la navegación




                           J. Castelain, D. Ciccale   43
                               MediaNet Software
Router
var Router = Backbone.Router.extend({
  routes: {
      '/': 'homePage',
      '/users/:id': 'userPage'
  }
});




                                        J. Castelain, D. Ciccale   44
                                            MediaNet Software
Router
var Router = Backbone.Router.extend({
      ...
  userPage: function (id) {
      console.log('Buscando el usuario:', id);
  }
});




                                                 J. Castelain, D. Ciccale   45
                                                     MediaNet Software
Router
• Controla la navegación
• Utiliza el History API de HTML5 (o un fallback)

var router = new Router();
Backbone.History.start({ pushState: true });




                                               J. Castelain, D. Ciccale   46
                                                   MediaNet Software
Events
• Comunicación entre objetos (Modelos,
  Colecciones…)




                                     J. Castelain, D. Ciccale   47
                                         MediaNet Software
Events
var obj = _.extend(Backbone.Events, {});


obj.on('search:user', function (id) {
  console.log('Buscando al usuario:', id);
  // Buscando al usuario: 567
});
...
obj.trigger('search:user', 567);



                                             J. Castelain, D. Ciccale   48
                                                 MediaNet Software
Events
• Comunicación entre objetos (Modelos,
  Colecciones…)
• Integrado en el núcleo de Backbone
    •   Modelos y colecciones publican
    •   Vistas se subscriben




                                         J. Castelain, D. Ciccale   49
                                             MediaNet Software
Events
var UserView = Backbone.View.extend({
  initialize: function () {
      this.model.on('change', this.render, this);
      // para escuchar el cambio de una propiedad específica
      // this.model.on('change:firstName', this.render, this);
  }
});




                                               J. Castelain, D. Ciccale   50
                                                   MediaNet Software
Data binding
• Backbone no tiene data binding




                                   J. Castelain, D. Ciccale   51
                                       MediaNet Software
Data binding
• Backbone no tiene data binding
• Comunicación entre modelos y vistas a través de
  eventos
    •   var pubsub = _.extend(Backbone.Events, {});
    •   jquery.xxspubsub.js (https://gist.github.com/1653547)
    •   Pubsub en CoffeScript
        (https://gist.github.com/2175018)



                                            J. Castelain, D. Ciccale   52
                                                MediaNet Software
Gestión de recursos
Gestión de recursos
• ¿Muchos recursos?




                      J. Castelain, D. Ciccale   54
                          MediaNet Software
Gestión de recursos
• ¿Muchos recursos?
<!doctype html>
<head>
  <script src="libs/jquery.min.js"></script>
  <script src="libs/underscore.min.js"></script>
  <script src="libs/backbone.min.js"></script>
  <script src="modules/chat.js"></script>
  <script src="modules/dashboard.js"></script>
  <script src="app/main.js"></script>
</head>
...

                                                   J. Castelain, D. Ciccale   55
                                                       MediaNet Software
Gestión de recursos
• ¿Muchos recursos?
• RequireJS (module loader)




                              J. Castelain, D. Ciccale   56
                                  MediaNet Software
Gestión de recursos
• ¿Muchos recursos?
• RequireJS (module loader)
• ¿Por qué RequireJS?
    •   yepnope, lab.js (script loaders)




                                           J. Castelain, D. Ciccale   57
                                               MediaNet Software
RequireJS
require(['libs/jquery.min'], function () {
  console.log(jQuery);
});




                                      J. Castelain, D. Ciccale   58
                                          MediaNet Software
RequireJS
define('mymodule', ['libs/jquery.min', 'libs/underscore.min',
    'libs/backbone.min'], function () {
 var View = Backbone.View.extend({});


 return {
      id: 'mymodule',
      route: '/mymodule',
      View: View
 };
});


                                                         J. Castelain, D. Ciccale   59
                                                             MediaNet Software
RequireJS
require(['mymodule'], function (mymodule) {
  var view = new mymodule.View();
  $('#container').append(view.render().el);
});




                                              J. Castelain, D. Ciccale   60
                                                  MediaNet Software
RequireJS Plugins
• Para cargar:
    •   text (html, css)
    •   cs (coffeescript)
    •   async (de manera asíncrono)
    •   order (en orden)




                                      J. Castelain, D. Ciccale   61
                                          MediaNet Software
Tests Unitarios
Tests Unitarios
•   Opciones




                  J. Castelain, D. Ciccale   63
                      MediaNet Software
QUnit
• Sencillo
• Buena documentación
• Tests de Backbone.js en QUnit




                                  J. Castelain, D. Ciccale   64
                                      MediaNet Software
QUnit
module('app', {
  setup: function () {
       /* se ejecuta antes de cada tests */
  },
  teardown: function () {
       /* se ejecuta luego de finalizar un test */
  }
});


                                                J. Castelain, D. Ciccale   65
                                                    MediaNet Software
QUnit
test('Probamos el modelo User', function () {
  var user = new User();
  deepEqual(user.get('firstName'), '', 'Usuario sin nombre');
});




                                                J. Castelain, D. Ciccale   66
                                                    MediaNet Software
Conclusiones
Recursos
Recursos
•   Backbonejs.org
•   Backbone Fundamentals
•   PeepCode
•   Los Techies
•   Backbone source code



                            J. Castelain, D. Ciccale   69
                                MediaNet Software
¿Preguntas?
J. Castelain, D. Ciccale
    MediaNet Software
Gracias
Denis
   - @tdecs
   - github.com/dciccale
Julien
   - @__juju__
   - github.com/julien

Más contenido relacionado

PPSX
S.P.A com Backbone.js
PDF
Fidelis Implementation
DOCX
Editorial
PDF
Crónica Fernado Dacosta&Eanes
PPTX
Jadugar Dinesh Magician profile
DOC
Hebron_Letter
PPTX
Hernando emerson
S.P.A com Backbone.js
Fidelis Implementation
Editorial
Crónica Fernado Dacosta&Eanes
Jadugar Dinesh Magician profile
Hebron_Letter
Hernando emerson

Similar a S.P.A con Backbone.js (20)

PPSX
Introducción a Cocos2D
PPTX
Introducción a Cocos2D: Evento Codemotion
PDF
Combinatoria, programación para tus ideas
PDF
20100416 open segovia_codesyntax
PPSX
MediaNet Software
PPT
03 Tecsidel VII Semana CMMI
PDF
Lineas Innovacion Vertice
PDF
200405 - Aplicaciones Web
PDF
La mejora en una organización veterana en CMMI - Software Factory de Tecsidel...
PPT
Actividades del Centro de Competencia en Movilidad de Valladolid (02/2012)
PDF
Activica - Soluciones de Software
PDF
VMN+ Where Agile really matters
 
PDF
Personalización del SIGB Koha para bibliotecas españolas:pros y contras
PPT
Calidad del Software para futuros ingenieros en tiempos de crisis
PDF
SAPreviews Magazine Marzo 2012 Micro Focus
PDF
Vertice In2
PDF
GWT: Why GWT, GQuery, and RequestFactory
PPT
Presentacion Cast Info 2007
PDF
09 Modelo De Desarrollo De Negocio Producto Libre Neurowork Why Floss
PDF
Modelo de desarrollo de negocio de un producto basado en software libre
Introducción a Cocos2D
Introducción a Cocos2D: Evento Codemotion
Combinatoria, programación para tus ideas
20100416 open segovia_codesyntax
MediaNet Software
03 Tecsidel VII Semana CMMI
Lineas Innovacion Vertice
200405 - Aplicaciones Web
La mejora en una organización veterana en CMMI - Software Factory de Tecsidel...
Actividades del Centro de Competencia en Movilidad de Valladolid (02/2012)
Activica - Soluciones de Software
VMN+ Where Agile really matters
 
Personalización del SIGB Koha para bibliotecas españolas:pros y contras
Calidad del Software para futuros ingenieros en tiempos de crisis
SAPreviews Magazine Marzo 2012 Micro Focus
Vertice In2
GWT: Why GWT, GQuery, and RequestFactory
Presentacion Cast Info 2007
09 Modelo De Desarrollo De Negocio Producto Libre Neurowork Why Floss
Modelo de desarrollo de negocio de un producto basado en software libre
Publicidad

Último (20)

PPTX
Uso responsable de la tecnología - EEST N°1
PPTX
Presentación final ingenieria de metodos
PDF
Presentación_u.01_digitalización_CFGS.pdf
PPTX
Usuarios en la arquitectura de la información
DOCX
tablas tecnologia maryuri vega 1....docx
PDF
CONTABILIDAD Y TRIBUTACION, EJERCICIO PRACTICO
PDF
Trabajo de recuperación _20250821_191354_0000.pdf
PPTX
libro proyecto con scratch jr pdf en la e
DOCX
Nombre del estudiante Gabriela Benavides
PPTX
PRESENTACION El PODER DE LA MENTALIDAD.pptx
PPTX
CLASE PRACTICA-- SESION 6 -- FPW -- 04 11 23.pptx
PPTX
Control de calidad en productos de frutas
PPTX
El uso de las TIC en la vida cotidiana..
PDF
Inteligencia_Artificial,_Informática_Básica,_22_06_2025_SO_2.pdf
PDF
Distribucion de frecuencia exel (1).pdf
PDF
Teoría de estadística descriptiva y aplicaciones .pdf
PPTX
Sistema de Gestión Integral TCA Ingenieros.pptx
PPTX
Tema 1 Taller de tecnologia y proceso tecnologico.pptx
PPTX
Mecanismos-de-Propagacion de ondas electromagneticas
PDF
Taller tecnológico Michelle lobo Velasquez
Uso responsable de la tecnología - EEST N°1
Presentación final ingenieria de metodos
Presentación_u.01_digitalización_CFGS.pdf
Usuarios en la arquitectura de la información
tablas tecnologia maryuri vega 1....docx
CONTABILIDAD Y TRIBUTACION, EJERCICIO PRACTICO
Trabajo de recuperación _20250821_191354_0000.pdf
libro proyecto con scratch jr pdf en la e
Nombre del estudiante Gabriela Benavides
PRESENTACION El PODER DE LA MENTALIDAD.pptx
CLASE PRACTICA-- SESION 6 -- FPW -- 04 11 23.pptx
Control de calidad en productos de frutas
El uso de las TIC en la vida cotidiana..
Inteligencia_Artificial,_Informática_Básica,_22_06_2025_SO_2.pdf
Distribucion de frecuencia exel (1).pdf
Teoría de estadística descriptiva y aplicaciones .pdf
Sistema de Gestión Integral TCA Ingenieros.pptx
Tema 1 Taller de tecnologia y proceso tecnologico.pptx
Mecanismos-de-Propagacion de ondas electromagneticas
Taller tecnológico Michelle lobo Velasquez
Publicidad

S.P.A con Backbone.js

  • 1. S.P.A. con Backbone.js Julien Castelain Denis Ciccale
  • 2. Nosotros Desarrolladores front auto-didactas • Trabajan en MediaNet Software como UX Technical Leaders • Actualmente usando Backbone.js en un proyecto para uno de los 5 bancos más grandes de Europa J. Castelain, D. Ciccale MediaNet Software
  • 3. ¿De qué vamos a hablar? • Acerca de MediaNet Software • Backbone.js & MVC • Gestión de recursos • Tests Unitarios • Conclusiones • ¿Preguntas? J. Castelain, D. Ciccale 3 MediaNet Software
  • 5. EMPRESA ESPAÑOLA EMPRESA ESPAÑOLA FUNDADA EN 1995 FUNDADA EN 1995 TRAYECTORIA DE SPIN-OFFS Y TRAYECTORIA DE SPIN-OFFS Y START-UPS START-UPS J. Castelain, D. Ciccale MediaNet Software
  • 6. PERFIL DE EMPRESA: PERFIL DE EMPRESA: ARTESANÍA: ARTESANÍA: CONOCIMIENTO + CONOCIMIENTO + EXPERIENCIA EXPERIENCIA http://www.flickr.com/photos/24443965@N08/ J. Castelain, D. Ciccale MediaNet Software
  • 7. 18/03/12 194 Medianos - Google Maps PERFIL DE EMPRESA: PERFIL DE EMPRESA: MÁS DE 200 ESPECIALISTAS MÁS DE 200 ESPECIALISTAS ©2012 Google - 194 Medianos Publicación restringida · 68 vistas Creado el 12 de Mar · Por · Actualizado hace 2 días J. Castelain, D. Ciccale MediaNet Software Argentina - Comodoro Rivadavia
  • 8. UNA CULTURA BASADA EN UNA CULTURA BASADA EN LA INNOVACIÓN LA INNOVACIÓN UN ENFOQUE CENTRADO UN ENFOQUE CENTRADO EN EL PROYECTO EN EL PROYECTO J. Castelain, D. Ciccale MediaNet Software
  • 9. NUESTRA FÓRMULA: NUESTRA FÓRMULA: COMPROMISO COMPROMISO VISIÓN A LARGO PLAZO VISIÓN A LARGO PLAZO EQUIPO EQUIPO J. Castelain, D. Ciccale MediaNet Software
  • 10. tivo s s vo bjje ti e e ob o n de d iciió n ó arttic p r mp a Co m ¿QUÉ HACEMOS? ¿QUÉ HACEMOS? Co NUESTRAS ÁREAS DE NUESTRAS ÁREAS DE ACTIVIDAD ACTIVIDAD J. Castelain, D. Ciccale MediaNet Software
  • 11. Y SOBRE TODO: Y SOBRE TODO: LAS PERSONAS SON LAS PERSONAS SON SIEMPRE LO PRIMERO SIEMPRE LO PRIMERO J. Castelain, D. Ciccale MediaNet Software
  • 13. Es una librería que permite estructurar una aplicación web siguiendo el concepto de MVC J. Castelain, D. Ciccale MediaNet Software
  • 14. Otros frameworks MVC J. Castelain, D. Ciccale MediaNet Software
  • 15. Componentes de Backbone.js J. Castelain, D. Ciccale 15 MediaNet Software
  • 16. Models • Representa los datos J. Castelain, D. Ciccale 16 MediaNet Software
  • 17. Models var User = Backbone.Model.extend({ defaults: { firstName: '', lastName: '', date: null }, url: '/user' }); J. Castelain, D. Ciccale 17 MediaNet Software
  • 18. Models • Representa los datos • Notifica de cambios en sus atributos J. Castelain, D. Ciccale 18 MediaNet Software
  • 19. Models • Representa los datos • Notifica de cambios en sus atributos • Se comunica con el servidor para estar sincronizado • fetch (GET), save (POST/PUT), destroy (DELETE) J. Castelain, D. Ciccale 19 MediaNet Software
  • 20. Models var user = new User(); user.on('change', function () { console.log(user.toJSON()); }); user.fetch(); // GET json // actualización user.set({firstName: 'Jeremy', lastName: 'Ashkenas'}); user.save(); // POST/PUT J. Castelain, D. Ciccale 20 MediaNet Software
  • 21. Collections • Conjunto de modelos J. Castelain, D. Ciccale 21 MediaNet Software
  • 22. Collections var Users = Backbone.Collection.extend({ model: User, // modelo que usa la colección url: '/users' // url que devuelve los datos }); J. Castelain, D. Ciccale 22 MediaNet Software
  • 23. Collections • Conjunto de modelos • Se comporta como un modelo J. Castelain, D. Ciccale 23 MediaNet Software
  • 24. Collections var users = new Users(); users.fetch(); // petición GET a /users … console.log(users.models); J. Castelain, D. Ciccale 24 MediaNet Software
  • 25. Collections • Conjunto de modelos • Se comporta como un modelo • Eventos • add, remove, refresh, reset J. Castelain, D. Ciccale 25 MediaNet Software
  • 26. Collections var users = new Users(); users.on('reset', function () { console.log('modelos reemplazados!'); }); users.fetch(); // GET /users J. Castelain, D. Ciccale 26 MediaNet Software
  • 27. Collections • Conjunto de modelos • Se comporta como un modelo • Eventos • add, remove, refresh, reset • Fácil manipulación gracias a Underscore.js • forEach (each), map, reduce (foldl, inject), reduceRight (foldr), find (detect), filter (select), reject, every (all), some (any), include, invoke, max, min, sortBy, groupBy, sortedIndex, shuffle, toArray, size, first, initial, rest, last, without, indexOf, lastIndexOf, isEmpty, chain J. Castelain, D. Ciccale 27 MediaNet Software
  • 28. Views • Representación gráfica de los datos • template, initialize, model, render, el J. Castelain, D. Ciccale 28 MediaNet Software
  • 29. Views var UserView = Backbone.View.extend({ template: _.template($('#userView').html()), initialize: function () { this.render(); }, render: function () { this.$el.html(this.template(this.model.toJSON())); return this; } }); J. Castelain, D. Ciccale 29 MediaNet Software
  • 30. Views <!-- UserView template --> <script type="text/template" id="userView"> <h2>Usuario</h2> <p>Nombre: <%= firstName %></p> <p>Apellido: <%= lastName %></p> </script> J. Castelain, D. Ciccale 30 MediaNet Software
  • 31. Views // instanciamos la vista var userView = new UserView({model: user}); userView.el.appendTo(document.body); .... <div> <h2>Usuario</h2> <p>Nombre: Jeremy</p> <p>Apellido: Ashkenas</p> </div> J. Castelain, D. Ciccale 31 MediaNet Software
  • 32. Views • Representación gráfica de los datos • template, initialize, model, render, el • Puede mantenerse sincronizada con el modelo o una colección J. Castelain, D. Ciccale 32 MediaNet Software
  • 33. Views var UserView = Backbone.View.extend({ … initialize: function () { this.model.on('change', this.render, this); } … }); J. Castelain, D. Ciccale 33 MediaNet Software
  • 34. Views • Representación gráfica de los datos • template, Initialize, model, render, el • Puede mantenerse sincronizada con el modelo o una colección • Eventos (click, submit...) J. Castelain, D. Ciccale 34 MediaNet Software
  • 35. Views var UserView = Backbone.View.extend({ initialize: function () { _.bindAll(this); }, events: { 'click #button': 'sayHello'; }, sayHello: function (event) { console.log('hello', this.model.get('firstName')); } }); J. Castelain, D. Ciccale 35 MediaNet Software
  • 36. Templating • Underscore, Handlebars J. Castelain, D. Ciccale 36 MediaNet Software
  • 37. Templating <script type="text/template" id="usersView"> <h2>Usuarios</h2> <ul> <% _.each(users, function (user) { %> <li>Usuario: <%= firstName %>, <%= lastName %></li> <% }); %> </ul> </script> J. Castelain, D. Ciccale 37 MediaNet Software
  • 38. Templating <script> _.templateSettings = { interpolate : /{{(.+?)}}/g }; </script> J. Castelain, D. Ciccale 38 MediaNet Software
  • 39. Templating <script type="text/template" id="usersView"> <h2>Usuarios</h2> <ul> <% _.each(users, function (user) { %> <li>Usuario: {{ firstName }}, {{ lastName }}</li> <% }); %> </ul> </script> J. Castelain, D. Ciccale 39 MediaNet Software
  • 40. Templating var UserView = Backbone.View.extend({ template: Handlebars.compile($('#userView').html()), ... render: function () { this.$el.html(this.template(this.model.toJSON())); return this; } }); J. Castelain, D. Ciccale 40 MediaNet Software
  • 41. Templating <script type="text/template" id="usersView"> <h2>Usuarios</h2> <ul> {{#each users}} <li>Usuario: {{ firstName }}, {{ lastName }}</li> {{/each}} </ul> </script> J. Castelain, D. Ciccale 41 MediaNet Software
  • 43. Router • Controla la navegación J. Castelain, D. Ciccale 43 MediaNet Software
  • 44. Router var Router = Backbone.Router.extend({ routes: { '/': 'homePage', '/users/:id': 'userPage' } }); J. Castelain, D. Ciccale 44 MediaNet Software
  • 45. Router var Router = Backbone.Router.extend({ ... userPage: function (id) { console.log('Buscando el usuario:', id); } }); J. Castelain, D. Ciccale 45 MediaNet Software
  • 46. Router • Controla la navegación • Utiliza el History API de HTML5 (o un fallback) var router = new Router(); Backbone.History.start({ pushState: true }); J. Castelain, D. Ciccale 46 MediaNet Software
  • 47. Events • Comunicación entre objetos (Modelos, Colecciones…) J. Castelain, D. Ciccale 47 MediaNet Software
  • 48. Events var obj = _.extend(Backbone.Events, {}); obj.on('search:user', function (id) { console.log('Buscando al usuario:', id); // Buscando al usuario: 567 }); ... obj.trigger('search:user', 567); J. Castelain, D. Ciccale 48 MediaNet Software
  • 49. Events • Comunicación entre objetos (Modelos, Colecciones…) • Integrado en el núcleo de Backbone • Modelos y colecciones publican • Vistas se subscriben J. Castelain, D. Ciccale 49 MediaNet Software
  • 50. Events var UserView = Backbone.View.extend({ initialize: function () { this.model.on('change', this.render, this); // para escuchar el cambio de una propiedad específica // this.model.on('change:firstName', this.render, this); } }); J. Castelain, D. Ciccale 50 MediaNet Software
  • 51. Data binding • Backbone no tiene data binding J. Castelain, D. Ciccale 51 MediaNet Software
  • 52. Data binding • Backbone no tiene data binding • Comunicación entre modelos y vistas a través de eventos • var pubsub = _.extend(Backbone.Events, {}); • jquery.xxspubsub.js (https://gist.github.com/1653547) • Pubsub en CoffeScript (https://gist.github.com/2175018) J. Castelain, D. Ciccale 52 MediaNet Software
  • 54. Gestión de recursos • ¿Muchos recursos? J. Castelain, D. Ciccale 54 MediaNet Software
  • 55. Gestión de recursos • ¿Muchos recursos? <!doctype html> <head> <script src="libs/jquery.min.js"></script> <script src="libs/underscore.min.js"></script> <script src="libs/backbone.min.js"></script> <script src="modules/chat.js"></script> <script src="modules/dashboard.js"></script> <script src="app/main.js"></script> </head> ... J. Castelain, D. Ciccale 55 MediaNet Software
  • 56. Gestión de recursos • ¿Muchos recursos? • RequireJS (module loader) J. Castelain, D. Ciccale 56 MediaNet Software
  • 57. Gestión de recursos • ¿Muchos recursos? • RequireJS (module loader) • ¿Por qué RequireJS? • yepnope, lab.js (script loaders) J. Castelain, D. Ciccale 57 MediaNet Software
  • 58. RequireJS require(['libs/jquery.min'], function () { console.log(jQuery); }); J. Castelain, D. Ciccale 58 MediaNet Software
  • 59. RequireJS define('mymodule', ['libs/jquery.min', 'libs/underscore.min', 'libs/backbone.min'], function () { var View = Backbone.View.extend({}); return { id: 'mymodule', route: '/mymodule', View: View }; }); J. Castelain, D. Ciccale 59 MediaNet Software
  • 60. RequireJS require(['mymodule'], function (mymodule) { var view = new mymodule.View(); $('#container').append(view.render().el); }); J. Castelain, D. Ciccale 60 MediaNet Software
  • 61. RequireJS Plugins • Para cargar: • text (html, css) • cs (coffeescript) • async (de manera asíncrono) • order (en orden) J. Castelain, D. Ciccale 61 MediaNet Software
  • 63. Tests Unitarios • Opciones J. Castelain, D. Ciccale 63 MediaNet Software
  • 64. QUnit • Sencillo • Buena documentación • Tests de Backbone.js en QUnit J. Castelain, D. Ciccale 64 MediaNet Software
  • 65. QUnit module('app', { setup: function () { /* se ejecuta antes de cada tests */ }, teardown: function () { /* se ejecuta luego de finalizar un test */ } }); J. Castelain, D. Ciccale 65 MediaNet Software
  • 66. QUnit test('Probamos el modelo User', function () { var user = new User(); deepEqual(user.get('firstName'), '', 'Usuario sin nombre'); }); J. Castelain, D. Ciccale 66 MediaNet Software
  • 69. Recursos • Backbonejs.org • Backbone Fundamentals • PeepCode • Los Techies • Backbone source code J. Castelain, D. Ciccale 69 MediaNet Software
  • 71. J. Castelain, D. Ciccale MediaNet Software
  • 72. Gracias Denis - @tdecs - github.com/dciccale Julien - @__juju__ - github.com/julien

Notas del editor

  • #2: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #3: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #4: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #5: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #6: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE MediaNet Software es una empresa española consultora en TIC fundada en 1995, con sede principal en Madrid y delegación técnica en Oviedo. Cuenta con un equipo especializado en diferentes tecnologías de la información, que ha crecido de forma ordenada hasta más de 200 profesionales, dejando en el camino numerosas spin-offs y startups especializadas en modelos de negocio en internet como BuyVIP y MercaDeuda. La historia de Media Net Software y de las empresas surgidas desde su base, está llena de pequeños logros que han posibilitado nuevas apuestas y proyectos más ambiciosos en cada uno de sus pasos. El interés por conservar la identidad y cultura de la profesionalidad, el compromiso y la calidad ha hecho que el crecimiento haya sido lento, ordenado y también constante incluso en momentos recesivos de la economía 06/03/12 AUTORE
  • #7: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE MediaNet Software es una empresa que valora principalmente el interés técnico y fomenta la formación de sus profesionales. No somos una empresa que resuelve los problemas gracias a formar grandes equipos de trabajo; al contrario, formamos pequeños equipos de personas de excelente nivel humano y técnico. 06/03/12 AUTORE
  • #8: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE La plantilla de MediaNet está formada por más de 200 especialistas que comparten su vocación tecnológica, sus ganas de aprender y su compromiso con el trabajo bien hecho. 06/03/12 AUTORE
  • #9: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE Nuestros clientes delegan en MediaNet Software la creación de sistemas críticos para su negocio porque compartimos sus objetivos. A lo largo de nuestros más de 16 años de actividad, hemos entendido los condicionantes y el contexto de cada proyecto, hemos gestionado riesgos con transparencia, hemos aplicado metodologías ágiles, hemos asignado a personas con capacidad y actitud para sacar los retos adelante. Creemos que después de más de 300 proyectos realizados, los factores comunes que han caracterizado a cada uno de ellos son, en definitiva, la profesionalidad de las personas asignadas a un proyecto y la responsabilidad y compromiso de todas ellas con el éxito del mismo. 06/03/12 AUTORE
  • #10: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE La fórmula de nuestro éxito pasa por el compromiso con nuestros clientes y nuestra plantilla, la visión estratégica a largo plazo y la importancia que tiene nuestro equipo de profesionales 06/03/12 AUTORE
  • #11: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE Consultoría Tecnológica. Es nuestra principal área de actividad. El equipo de MNS está actualmente formado por más de 200 profesionales de formación técnica. Realizamos estudios de viabilidad tecnológica y análisis de herramientas; definimos entornos de desarrollo corporativos, e implantamos metodologías de trabajo ágiles. Todo según estándares de mercado, patrones y arquitecturas de referencia y buenas prácticas de referencia. Desarrollo a medida. Construimos aplicaciones que se adaptan a los requisitos específicos de nuestros clientes; integrándonos cuando es necesario con su infraestructura y parque de aplicaciones. Nuestras tecnologías de referencia son J2EE y .NET Movilidad. Desarrollamos aplicaciones de movilidad corporativas multi-plataforma; tanto en tecnología nativa (iOS, Android) como en HTML5 Experiencia de Usuario. Nuestro equipo de especialistas en User eXperience conceptualizan y definen la interacción del usuario con las aplicaciones que posteriormente desarrollamos. Las técnicas de prototipado y wireframming aseguran la agilidad en el uso de la aplicación y el soporte crossbrowsing Además, nuestro compromiso con el uso de estándares de mercado como WAI-AA, HTML 5 y JQERY y normativa internacional garantiza la accesibilidad de las aplicaciones Gestión de Proyectos. Colaboramos con grandes organizaciones en la gestión integral de proyectos, innovación y factorías de Software. Nuestro modelo de gestión parte de nuestro profundo conocimiento del mundo de la tecnología, Actualmente, los profesionales de MediaNet gestionan más de 400.000 horas de ingeniería al año. Gestión de infraestructuras. Definimos arquitecturas de sistemas, que implantamos, explotamos y gestionamos para nuestros clientes. Tanto en servidores físicos como en la nube. Desde 2008 somos proveedores de servicios Cloud, y actualmente somos socios tecnológicos de AWS y Azure Nuestro valor diferenciador es la capacidad de operar la infraestructura, y la información adicional de control de gestión que procesamos para nuestros clientes . eCommerce. Una de nuestras principales áreas de actividad es el desarrollo de modelos de e-commerce. Desde la venta privada a la tienda online con catálogo. 06/03/12 AUTORE
  • #12: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE En MediaNet las personas son siempre lo primero, porque hay otra forma de entender la tecnología. 06/03/12 AUTORE
  • #13: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #14: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #15: 06/03/12 AUTORE 06/03/12 AUTORE
  • #16: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #17: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #18: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #19: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #20: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #21: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #22: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #23: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #24: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #25: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #26: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #27: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #28: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #29: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #30: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #31: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #32: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #33: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #34: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #35: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #36: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #37: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #38: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #39: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #40: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #41: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #42: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #43: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #44: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #45: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #46: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #47: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #48: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #49: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #50: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #51: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #52: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #53: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #54: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #55: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #56: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #57: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #58: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #59: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #60: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #61: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #62: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #63: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #64: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #65: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #66: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #67: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #68: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #69: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #70: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #71: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #72: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE
  • #73: 06/03/12 AUTORE 06/03/12 AUTORE 06/03/12 AUTORE