Backbone JS
Últimamente lo vengo utilizando mucho y como me tiraron varias veces la pregunta “que es backbone?” armo este post para dar una idea de lo que es y sus principales características.
Backbone (columna vertebral en español) intenta darnos una estructura para nuestra aplicación cliente. La idea es básicamente pensar en Modelos, Colecciones (de modelos) y Vistas. Como agregado a estos también tenemos Eventos (para la comunicación entre estas capas) y ya enganchado adentro de los Modelos y Colecciones métodos para utilizar servicios JSON Restfull mediante AJAX.
En este post voy a mostrar Modelo y Colección, con sus eventos y persistencia en el server.
Dicho esto, veamos una imagen para hacerlo un poco mas claro:
Modelo (Backbone.Model)
Es el dominio de tu aplicación, la idea es que ahí guardes los estados de tus Entidades, con sus métodos y también puede llegar a acceder al server mediante AJAX ya sea para un DELETE (eliminar), PUT (actualizar) o un POST (crear).
Propiedades y Eventos de un Modelo
En un modelo de Backbone las propiedades de instancia se guardan todas adentro de “attributes”. Y a diferencia de lo que estamos acostubrados en js, por ejemplo un json, se acceden por 2 métodos get y set:
Cuando realizamos un set se dispara un evento “change”, podemos escuchar los eventos del modelo con el método on:
Colección (Backbone.Collection)
También es parte de tu dominio, están pensadas como colecciones de modelos. Aparte de esto, tiene muchas utilidades mas, como centralizar métodos al servidor, ordenar los modelos, eventos, etc.
Modificando una Colección
Ya vimos como crear una colección pasandole modelos, ahora veamos como agregar y eliminar modelos.
En Backbone ya tenemos por defecto dentro de una coleccion todos las funciones (creo que todas) de UnderscoreJS. Lo que significa que podemos usar, por ejemplo el each:
Eventos de una Colección
Así como los modelos tienen eventos de cambio (change), la colección nos agrega algunos mas
De la misma manera que nos des/suscribimos a los eventos de un modelo con “on” y “off”, lo podemos hacer en una colección para el add, remove o reset.
El evento change de una colección se va a disparar cuando algún modelo que se encuentre en ella dispare el change.
Persistiendo en el servidor:
Algo a tener en cuenta antes de meternos con persistencia, es ver como se mapean los métodos HTTP con las acciones:
Obtener un Recurso = GET
Nuevo Recurso = POST
Actualizar Recurso Existente = PUT
Eliminar un Recurso = DELETE
En backbone no vamos a estar pensando en los métodos HTTP, simplemente utilizamos los de backbone:
Algo a tener en cuenta es que para que los métodos del modelo disparen un pedido al servidor, tienen que estar dentro de una colección con su atributo url especificado.
En caso de que no tengamos una colección y sea simplemente un modelo que tiene que disparar pedidos al servidor, tenemos que especificarle el atributo urlRoot al modelo directamente (backbone se va a encargar de agregar el id de la entidad al final de la url en cada pedido):
Identificadores en un modelo
Backbone va a utilizar por defecto la propiedad con nombre id como el id del modelo (en caso de que exista). Para cambiar eso, es simplemente especificarle en la colección otro atributo como:
Si no hay una propiedad id y tampoco especificas otra, tené en cuenta que para backbone ese modelo es NUEVO, es decir, va a resultar siempre en un POST y si le preguntas a Backbone, te va a decir:
Hay mucho, pero mucho más para ver de Backbone, así que si alguien quiere prenderse y armar un post de Vistas, sería genial!
También existen otras bibliotecas para atacar la estructuración, eventos, etc de una aplicación cliente, como Angular, CanJS, Ember, etc. No tuve experiencias con esas todavía, me gustaría escuchar la de ustedes 😉
Pueden ver ejemplos ya armados con muchas bibliotecas en TODO MVC