SlideShare uma empresa Scribd logo
1 de 14
Handlebars
De JSON a HTML en menos que canta un gallo



                   Eduard Tomàs i Avellana
                               @eiximenis
Qué es Handlebars

   Librería de templating para Javascript
   Objetivo: pasar de JSON a HTML (DOM)
Alternativas

   Jquery_tmpl (discontinuado)
   PURE (Pure Unobtrusive Rendering Engine)
   jsRender (beta)
   _.template
   …
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
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
Compilar un template

   Llamar a Handlebars.compile(“template”)
        “template” es la cadena con el contenido del template


   El resultado es una función js
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
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
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 “”
         ó []
“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.
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;
});
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.
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>";
    });
¡Gracias!




Q&A

Mais conteúdo relacionado

Mais procurados

Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascriptaitorgr
 
Objetos implícitos
Objetos implícitosObjetos implícitos
Objetos implícitospaulacas
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasJose Bustamante Romero
 
PHP & XML: SimpleXML, DOMDocument
PHP & XML: SimpleXML, DOMDocumentPHP & XML: SimpleXML, DOMDocument
PHP & XML: SimpleXML, DOMDocumentValentin Bora
 
M. carrito d compra en phpfinal
M. carrito d compra en phpfinalM. carrito d compra en phpfinal
M. carrito d compra en phpfinalAbyliel Garcia
 

Mais procurados (7)

Introduccion a j_query
Introduccion a j_queryIntroduccion a j_query
Introduccion a j_query
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascript
 
Objetos implícitos
Objetos implícitosObjetos implícitos
Objetos implícitos
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
PHP & XML: SimpleXML, DOMDocument
PHP & XML: SimpleXML, DOMDocumentPHP & XML: SimpleXML, DOMDocument
PHP & XML: SimpleXML, DOMDocument
 
M. carrito d compra en phpfinal
M. carrito d compra en phpfinalM. carrito d compra en phpfinal
M. carrito d compra en phpfinal
 
J query
J queryJ query
J query
 

Semelhante a Handlebars

CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010Comunidad SharePoint
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009Irontec
 
Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1hsg2020
 
Sesion1 Php Basico
Sesion1 Php BasicoSesion1 Php Basico
Sesion1 Php BasicoHugo Flores
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyJose Juan R. Zuñiga
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCCarlos Hernando
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSIan Monge Pérez
 
6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)Laura Folgado Galache
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......SaulSalinasNeri
 
Introducción a la programación con Javascript. Clase 4
Introducción a la programación con Javascript. Clase 4Introducción a la programación con Javascript. Clase 4
Introducción a la programación con Javascript. Clase 4xjordi
 
Taller programación web ajax con jquery
Taller programación web  ajax con jqueryTaller programación web  ajax con jquery
Taller programación web ajax con jqueryPablo Galeana Bailey
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodosDanae Aguilar Guzmán
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básicocamposer
 
El lenguaje C++ (1).ppt
El lenguaje C++ (1).pptEl lenguaje C++ (1).ppt
El lenguaje C++ (1).pptJOSECASHUUG
 

Semelhante a Handlebars (20)

Codigo
CodigoCodigo
Codigo
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
 
Jquery parte 1
Jquery parte 1Jquery parte 1
Jquery parte 1
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009
 
P2C2 Introducción a JEE5
P2C2 Introducción a JEE5P2C2 Introducción a JEE5
P2C2 Introducción a JEE5
 
Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1
 
Sesion1 Php Basico
Sesion1 Php BasicoSesion1 Php Basico
Sesion1 Php Basico
 
Separata java script
Separata java scriptSeparata java script
Separata java script
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
 
6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
 
Introducción a la programación con Javascript. Clase 4
Introducción a la programación con Javascript. Clase 4Introducción a la programación con Javascript. Clase 4
Introducción a la programación con Javascript. Clase 4
 
Taller programación web ajax con jquery
Taller programación web  ajax con jqueryTaller programación web  ajax con jquery
Taller programación web ajax con jquery
 
Lectura de un archivo xml de manera local en wp
Lectura de un archivo xml de manera local en wpLectura de un archivo xml de manera local en wp
Lectura de un archivo xml de manera local en wp
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básico
 
El lenguaje C++ (1).ppt
El lenguaje C++ (1).pptEl lenguaje C++ (1).ppt
El lenguaje C++ (1).ppt
 

Mais de Eduard Tomàs

Kubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sKubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sEduard Tomàs
 
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAKCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAEduard Tomàs
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEduard Tomàs
 
C#9 - Más C# que nunca
C#9 - Más C# que nuncaC#9 - Más C# que nunca
C#9 - Más C# que nuncaEduard Tomàs
 
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDACollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDAEduard Tomàs
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessEduard Tomàs
 
.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y RendimientoEduard Tomàs
 
Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Eduard Tomàs
 
Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Eduard Tomàs
 
Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Eduard Tomàs
 
El "peor" lenguaje del mundo
El "peor" lenguaje del mundoEl "peor" lenguaje del mundo
El "peor" lenguaje del mundoEduard Tomàs
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aksEduard Tomàs
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Eduard Tomàs
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosEduard Tomàs
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbEduard Tomàs
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menosEduard Tomàs
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?Eduard Tomàs
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your deviceEduard Tomàs
 

Mais de Eduard Tomàs (20)

Kubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sKubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why's
 
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAKCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con Keda
 
C#9 - Más C# que nunca
C#9 - Más C# que nuncaC#9 - Más C# que nunca
C#9 - Más C# que nunca
 
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDACollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en Serverless
 
.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y Rendimiento
 
Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)
 
Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)
 
Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++
 
El "peor" lenguaje del mundo
El "peor" lenguaje del mundoEl "peor" lenguaje del mundo
El "peor" lenguaje del mundo
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aks
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramos
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDb
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menos
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
Azure functions
Azure functionsAzure functions
Azure functions
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your device
 

Handlebars

  • 1. Handlebars De JSON a HTML en menos que canta un gallo Eduard Tomàs i Avellana @eiximenis
  • 2. Qué es Handlebars  Librería de templating para Javascript  Objetivo: pasar de JSON a HTML (DOM)
  • 3. Alternativas  Jquery_tmpl (discontinuado)  PURE (Pure Unobtrusive Rendering Engine)  jsRender (beta)  _.template  …
  • 4. 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
  • 5. 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
  • 6. Compilar un template  Llamar a Handlebars.compile(“template”)  “template” es la cadena con el contenido del template  El resultado es una función js
  • 7. 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
  • 8. 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
  • 9. 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 “” ó []
  • 10. “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.
  • 11. 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; });
  • 12. 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.
  • 13. 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>"; });