Ir al contenido principal

Destacado

Node | Debug nestjs app en vscode

Recientemente me encontré trabajando en un proyecto basado en nestjs y una cosa que me sorprendió fue la cantidad de console.log distribuidos por todo el repositorio, señal de que el equipo lo usaba como su principal forma de depurar. Un poco old school para mí gusto para ser sincero, así que, ¿Por qué no usar vscode a tu favor? La siguiente configuración ademas de correr la app,  enlaza  el debugger al proceso node. En MacOS:   Ejecutar > Agregar configuración... Listo, ya podemos poner breakpoints en donde lo requiramos, sencillo no? C you space cowboy!

Backbone II | Modelos

Bueno hoy hablaremos un poco más de Backbone, en el capítulo anterior vimos una introducción leve a los modelos, en este pequeño post vamos a profundizar un poco más.

Requerimientos:


Modelos.
Como ya habíamos visto los modelos no son más que una representación lógica de una entidad de datos, Backbone provee una definición para definir y trabajar con ellos

Creación.
Lo primero que hay que hacer es definir nuestras clases Modelos mediante el método extend de Backbone.Model:

// Definición del User Model
var User = Backbone.Model.extend({});
// Instancia de Usuario
var testUser = new User( { name: 'Mario', username: 'mario192', email: 'mario@hotmail.com.tv'} );

console.log(testUser.get('name'));
// Mario
console.log(testUser.get('email'));
// mario@hotmail.com.tv


En este caso definimos un modelo User vacío sólo para efectos del ejemplo pero es posible definir cuantas propiedades necesitemos.


Creación con Defaults.
Los modelos tienen una propiedad llamada defaults que sirve para definir los valores por defecto que se asignaran a los atributos si estos no son especificados al momento de crear el objeto.

var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    }
});

var testUser = new User({name:'test'});

console.log(testUser.get('username'));
// test@gmail.com

console.log(testUser.get('name'));
// test

Constructor/Initialize
Es posible definir una propiedad constructor o initialize que será llamada cada vez que se cree una instancia y a través de la cuál se pueden pasar los valores iniciales de la data en un modelo.

var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    },
    initialize: function(attributes, options) {
        this._isBlocked = false;
    }
});

Estado ( data )
El estado de un modelo se almacena en una propiedad especial llamada attributes, está propiedad contiene por lo general un objeto JSON que representan los datos en el servidor.

No se recomienda manipular directamente esta propiedad, Backbone dispone de dos métodos en dado caso de que se requiera obtener o actualizar dichos valores.

Actualizar Estado ( data )
Para actualizar el estado de alguna de las propiedades en attributes se emplea el método set definido en Backbone.Model

var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    },
    initialize: function(attributes, options) {
        this._isBlocked = false;
    }
});

var testUser = new User({name: 'Susan'});
console.log(testUser.attributes['name']);
// Susan

testUser.set('name', 'Ash');
console.log(testUser.attributes['name']);
// Ash

Leer Estado ( data )
Para obtener el valor/estado de alguna de las propiedades en attributes se usa el método get ( Ya lo hemos usado en los ejemplos anteriores )
var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    },
    initialize: function(attributes, options) {
        this._isBlocked = false;
    }
});


var testUser = new User({name: 'Susan'});
console.log(testUser.get('name']);
// Susan  

REST Integration
Otra de las ventajas que obtenemos al usar Backbone es la integración transparente con RESTFUL APIs, solo basta definir la URL de nuestro endpoint en el modelo ( o colección ) y listo.
 
// Modelo independiente de Colección
var User = Backbone.Model.extends({
    urlRoot: 'https://jsonplaceholder.typicode.com/users'    
}); 

Cuando se trate de modelos que no estarán ligados a  una colección es necesario manipular la propiedad urlRoot  en caso contrario sólo modificamos la propiedad url.

Tanto los modelos como las colecciones proveen la siguiente interfaz para comunicarse con los RESTFUL endpoints:

GET  /books/ .... collection.fetch();
POST /books/ .... collection.create();
GET  /books/1 ... model.fetch();
PUT  /books/1 ... model.save();
DEL  /books/1 ... model.destroy(); 


Solicitando un usuario:

var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({id:1});
testUser.fetch();
Creando un usuario:
var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({name:'Susan', email:'susan@test.com'});
testUser.save();


Actualizando un usuario:
var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({id:1});
testUser.fetch(); 
 
// Esperamos a que termine el request 
testUser.on('sync', function() {
    testUser.set('name', 'Marco Polo');
    testUser.save();
});


Eliminando un usuario:
var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({id:1});
testUser.fetch();

// Esperamos a que termine el request
testUser.on('sync', function() {
    testUser.destroy();
});


Creo que por el momento es todo, suficiente información para procesar... happy hacking!

Comentarios

Entradas populares