Backbone.js es una librería JavaScript que nos permite crear aplicaciones/sitios web que requieren de una basta interacción con el cliente, agregando la lógica del patrón MV* al ofrecer una estructura basada en modelos con la unión clave-valor
, colecciones con una API de funciones enumerables, vistas asociadas con el control de eventos personalizados y mediante a su sistema de enrutamiento sincroniza las modelos/vistas/colecciones a la API JSON de tu aplicación/sitio.
En el taller se desarrollara una aplicación sencilla en donde se explicara el uso de Backbone.js, sus conceptos básicos, aspectos de configuración y de como combinar esta herramienta con algún otro framework backend.
La siguiente figura ilustra como funciona una típica aplicación con Backbone.js:
Los modelos representan los datos de la aplicación y la lógica alrededor de estos datos.
Creamos un archivo llamado platica en /js/models/platica.js
, con el siguiente contenido:
1 var Platica = Backbone.Model.extend({
2 initialize: function () {
3 //Aquí agregamos los callbacks del modelo
4 this.on('change', function (){
5 console.log(this);
6 });
7 },
8 urlRoot : '/platicas'
9 defaults: {
10 nombre: '',
11 ponente: '',
12 hora : 'Por Confirmar'
13 }
14 });
1 var platica = new Platica({
2 nombre : 'Taller de backbone',
3 ponente : 'Fitorec'
4 });
5
6 platica.toJSON();
1 var platica1 = new Platica({
2 id : 1
3 });
4
5 // GET: /platicas/1
6 platica1.fetch();
7 platica1.toJSON();
1 var nuevaPlatica = new Platica({
2 nombre : 'Platica sobre nodejs',
3 ponente : 'Alguien'
4 });
5
6 // POST: /platicas/
7 //Si tuviera definido el 'id'
8 // PUT: /platicas/id
9 nuevaPlatica.save();
10 nuevaPlatica.toJSON();
1 // DELETE: /platicas/1
2 platica1.destroy();
1 var Platica = Backbone.Model.extend({
2 validate: function (atributos) {
3 if(!atributos.nombre) {
4 return "el campo nombre es obligatorio";
5 }
6 }
7 });
8
9 var platica = new Platica();
10 platica.save();
Una vista es la parte que contiene la lógica del renderizado, apoyándose de los templates
para mostrar el contenido html en la aplicación.
1 var Platica1Vista = Backbone.View.extend();
this.el
En Backbone toda vista contiene el atributo el
, el cual es una instancia en el DOM.
1 var platica1V = new Platica1Vista();
2 console.log( platica1V.el );
3 /* Resultado
4 * <div></div>
5 */
el
this.el
1 var Platica1Vista = Backbone.View.extend({
2 tagName : 'section',
3 className : 'platica',
4 id : 'platica-1'
5 });
6
7 // Valor el por defecto de Platica1Vista:
8 // <section class='platica' id='platica1'>
9 // </section>
this.el
puede definirse como un selector que apunte a un elemento o conjunto de elementos existentes en el DOM, por ejemplo:
1 var Platica1Vista = Backbone.View.extend({
2 el : '#platica-1'
3 });
this.el
y jQuery1 Se cumple que:
2 this.$el = $(this.el);
1 var Platica1Vista = Backbone.View.extend({
2 initialize : function() {
3 this.render();
4 },
5 render : function() {
6 this.$el.html('metodo render');
7 }
8 });
Los eventos son definidos en el objeto events
, la sintaxis es la siguiente:
1 events : {
2 '<evento1> <selector1>' : '<callback1>',
3 '<evento2> <selector2>' : '<callback2>',
4 ...
5 '<eventon> <selectorn>' : '<callbackn>',
6 }
Veamos un ejemplo:
1 var Platica1Vista = Backbone.View.extend({
2 events: {
3 'click .efecto' : 'efectoCallBack'
4 },
5 efectoCallBack : function() {
6 this.$el.fadeOut().fadeIn();
7 }
8 });
Las colecciones son un conjunto ordenado de modelos.
1 var PlaticasCollection = Backbone.Collection.extend({
2 model : Libro
3 });
4
5 var platicas = new PlaticasCollection();
1 var a = new Platica({nombre: 'taller de Backbone'}),
2 b = new Platica({nombre: 'otro taller'}),
3 c = new Platica({nombre: 'alguna otra platica'});
4
5 // Creamos la colección enviandole
6 // un conjunto de modelos(2)
7 var platicas = new PlaticasCollection([a,b]);
8 console.log(platicas.toJSON());
9
10 //Agregando la platica c
11 platicas.add(c);
12 console.log(platicas.toJSON());
1 //Borrando la platica a
2 platicas.remove(a);
3 console.log(platicas.toJSON());
4
5 //Borrando un conjunto de objetos
6 platicas.remove([b,c]);
7 console.log(platicas.toJSON());
1 //Cambiando el contenido de la coleccion
2 platicas.reset([
3 {nombre: 'taller backbone'}
4 ]);
5
6 //si no le pasamos nada, es una forma de vaciar
7 // una coleccion
8 platicas.reset();
Esto se realiza mediante la función get
de la colección, esta funcion puede recibir cualquiera de estos valores:
cid : identificador interno en Backbone.
!javascript var Platica1 = platicas.get(1);
Como las colecciones representan conjuntos de objetos podemos escuchar los eventos de agregar,quitar o al modificar modelos en dicho conjunto.
1 var platicas = new PlaticasCollection();
2 // Le agregamos el evento al modificar
3 platicas.on('add', function(){
4 console.log('Se agrego una nueva platica');
5 });
6
7 //agregamos platicas a la colección(disparando el evento)
8 platicas.add([
9 {nombre: 'platica 1'},
10 {nombre: 'platica 2'}
11 ]);
1 // Le agregamos el evento al modificar
2 platicas.on('change', function(){
3 console.log('Se agrego una nueva platica');
4 });
Nos ayudan a definir código genérico HTML, que serán renderizado con el contenido de nuestros modelos.
1 var planticaPlantilla = _.template('#platicaTemplate');
2 //
3 $('boddy').append(planticaPlantilla);
1 <script type='text/template' id='platicaTemplate'>
2 <h2><%= nombre %></h2>
3 <p><%= ponente %></p>
4 <small><%= hora %></small>
5 </script>
1 var Platica1Vista = Backbone.View.extend({
2 el : '#platicas'
3 initialize: function () {
4 app.platicas.on('add',
5 this.mostrarPlatica
6 );
7 app.platicas.fetch();
8 },
9 mostrarPlatica: function(platicaModel) {
10 var vista = new mostrarPlaticaView({model:platicaModel});
11 $('.platicas').append(vista.render().$el);
12 }
13 });
14 //Definiendo mostrarPlaticaView
15 var mostrarPlaticaView = Backbone.View.extend({
16 template : _.template( $('#platicas').html()),
17 render : function (){
18 this.$el.html (this.template(this.model.toJSON()));
19 return this;
20 }
21 });
1 var myRouter = Backbone.Router.extend({
2 routes : {
3 '' : 'mostrarEnlace1',
4 enlace1 : 'mostrarEnlace1',
5 ancle2 : 'mostrarEnlace2',
6 },
7 mostrarEnlace1: function () {
8 new VistaDisparada1();
9 },
10 mostrarEnlace2: function () {
11 new VistaDisparada2();
12 }
13 });
14
15 var myrouter = new myRouter();
16 Backbone.history.start();
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |