Handlebars

14
Handlebars De JSON a HTML en menos que canta un gallo Eduard Tomàs i Avellana @eiximenis

description

Introducción a Handlebarsks

Transcript of Handlebars

Page 1: Handlebars

HandlebarsDe JSON a HTML en menos que canta un gallo

Eduard Tomàs i Avellana

@eiximenis

Page 2: Handlebars

Qué es Handlebars

Librería de templating para Javascript

Objetivo: pasar de JSON a HTML (DOM)

Page 3: Handlebars

Alternativas

Jquery_tmpl (discontinuado)

PURE (Pure Unobtrusive Rendering Engine)

jsRender (beta)

_.template

Page 4: Handlebars

Handlebars

Cargar un template

Código “HTML” con mezcla de elementos de control

Compilar el template (convertirlo a una función js)

Ejecutar el template para obtener la cadena HTML

Insertar el HTML en el DOM

Page 5: Handlebars

Cargar un template

En tag <script> usando un type ignorado por el navegador

<script type=“text/x-handlebars-template”>…</script>

Template disponible en el DOM en el $(document).ready()

A través de llamada Ajax

Necesario sincronizar el retorno de la llamada con la compilación y ejecución de los templates

Page 6: Handlebars

Compilar un template

Llamar a Handlebars.compile(“template”)

“template” es la cadena con el contenido del template

El resultado es una función js

Page 7: Handlebars

Ejecutar un template

Invocar la función js devuelta por Handlebars.compile

Argumento: Objeto json con los datos del template

Devuelve: Cadena HTML resultado de aplicar el template

Page 8: Handlebars

Templates en Handlebars

Valores simples: {{valor}} / {{{valor}}}

La triple llave indica a Handlebars que no “escape” el código HTML de valor

Expresiones de bloque

{{#nombre}} … {{/nombre}}

Se evalúan en un contexto distinto al del template original

Page 9: Handlebars

Expresiones de bloque built-in

each {{#each expresion}}

Itera sobre cada elemento de expresión y genera el template asociado. El elemento por el que se itera pasa a ser el nuevo contexto

If {{#if expresion}}

Si expresión devuelve false, undefined, null, “” o [] NO renderiza el bloque

Admite bloque {{else}}

Unless {{#unless expresion}}

Contrario de if: Renderiza el bloque si expresión devuelve false, undefined, null “” ó []

Page 10: Handlebars

“Paths” en Handlebars

Path: Como a partir de una expresión se encuentra la propiedad del contexto (objeto JSON)

Simples: {{name}} -> Referencia a la propiedad “name” del contexto

Compuestas {{author.name}} -> Referencia a la propiedad “name” de la propiedad “author“ del contexto

Referencia a contexto padre: {{../name}} -> Referencia a la propiedad “name” del contexto padre. Se usa en expresiones de bloque.

Page 11: Handlebars

Helpers

Se pueden referenciar desde cualquier template y permiten ejecutar una función para modificar/combinar datos del contexto

{{fullName author}} -> Invoca al helper fullName pasándole la propiedad author del contexto

Se pueden crear y registrar helpers propios con Handlebars.registerHelper

Handlebars.registerHelper(‘fullName’, function(propValue) { return propValue.firstName + ‘ ‘ + propValue.lastName;});

Page 12: Handlebars

Helpers (ii)

Si un helper devuelve HTML, debe devolverlo a través del objeto Handlebars.SafeString, en caso contrario Handlebars escapará el HTML generado.

Los helpers reciben todo el contexto actual en this.

Page 13: Handlebars

Helpers de bloque

Se pueden definir expresiones de bloque propias: {{#list people}}{{firstName}} {{lastName}}{{/list} Son helpers con DOS parámetros

Lista de elementos (ítems) sobre la que iterar Subtemplates a aplicar (options)

Se aplican usando .fn(contexto)

Handlebars.registerHelper('list', function(items, options) { var out = "<ul>"; for(var i=0, l=items.length; i<l; i++) { out = out + "<li>" + options.fn(items[i]) + "</li>"; } return out + "</ul>";});

Page 14: Handlebars

¡Gracias!

Q&A