{"id":13,"date":"2016-04-16T14:24:01","date_gmt":"2016-04-16T14:24:01","guid":{"rendered":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/?p=13"},"modified":"2016-04-16T14:24:01","modified_gmt":"2016-04-16T14:24:01","slug":"uso-de-handlebars","status":"publish","type":"post","link":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/2016\/04\/16\/uso-de-handlebars\/","title":{"rendered":"Uso de handlebars"},"content":{"rendered":"<p>En esta peque\u00f1o tutorial veremos un ejemplo b\u00e1sico del uso de handlebars, que nos permita descubrir y entender\u00a0las principales partes implicadas en el trabajo con este motor de plantillas del lado cliente, que se caracteriza por no a\u00f1adir pr\u00e1cticamente l\u00f3gica funcional a las plantillas, centr\u00e1ndose en al sem\u00e1ntica.<\/p>\n<p>Los principales elementos en el trabajo con Handlebars son:<\/p>\n<ul>\n<li><strong>Un contexto:<\/strong> conjunto de datos que ser\u00e1n aplicados sobre la plantilla para obtener esa salida final.<\/li>\n<li><strong>Una plantilla:<\/strong> fragmento de HTML con elementos\u00a0especiales (denominados expresiones) que ser\u00e1n reemplazados con los datos finales a la hora de convertir la plantilla en la salida final para el navegador.<\/li>\n<li><strong>La librer\u00eda:<\/strong> que nos permite compilar la plantilla para posteriormente aplicarle\u00a0el contexto que\u00a0producir\u00e1 la salida final para le navegador.<\/li>\n<\/ul>\n<p>Veamos uno a uno el uso de \u00e9stos elementos para lograr el objetivo que no es otro que simplificar al m\u00e1ximo la generaci\u00f3n de contenido HTML a partir de un conjunto de datos con car\u00e1cter din\u00e1mico.<\/p>\n<h3>El contexto<\/h3>\n<p>Como dec\u00edamos el contexto es el conjunto de datos que permitir\u00e1 crear a partir de la plantilla un resultado de salida espec\u00edfico, este contexto puede ser un elemento simple o complejo, ya que handlebars permite acceder a propiedades en objetos anidados a trav\u00e9s de sus denominados \u00ab<em>nested paths<\/em>\u00ab.<\/p>\n<pre class=\"\">var data = {\r\n    usuarios: [\r\n        {\r\n            nombre: 'Marcos',\r\n            puntos: 1254\r\n        },\r\n        {\r\n            nombre: 'Carlos',\r\n            puntos: 1157\r\n        },\r\n        {\r\n            nombre: 'Mariano',\r\n            puntos: 0\r\n        },\r\n        {\r\n            nombre: 'Jose Luis',\r\n            puntos: 0\r\n        }\r\n    ]\r\n};<\/pre>\n<h3>La plantilla<\/h3>\n<p>La plantilla normalmente es un fragmento de HTML que incluye elementos adicionales conocidos como expresiones. Estas expresiones se evaluar\u00e1n al aplicar el contexto para generar el resultado final. Para incluir una plantilla handlebars en nuestro proyecto empleamos la etiqueta <span class=\"lang:xhtml decode:true crayon-inline \">&lt;script&gt;<\/span>\u00a0 con un valor\u00a0espec\u00edfico para el atributo <span class=\"lang:xhtml decode:true crayon-inline \">type<\/span>\u00a0\u00a0y en su interior definimos el HTML que queremos emplear como plantilla.<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;script id=\"user-template\" type=\"text\/x-handlebars-template\"&gt;\r\n        &lt;table class=\"table\"&gt;\r\n            &lt;thead&gt;\r\n                &lt;tr&gt;\r\n                    &lt;th&gt;#&lt;\/th&gt;\r\n                    &lt;th&gt;Usuario&lt;\/th&gt;\r\n                    &lt;th&gt;Puntuaci\u00f3n&lt;\/th&gt;\r\n                &lt;\/tr&gt;\r\n            &lt;\/thead&gt;\r\n            &lt;tbody&gt;\r\n                {{#each usuarios}}\r\n                &lt;tr&gt;\r\n                    &lt;td&gt;{{obtenerRanking}}&lt;\/td&gt;\r\n                    &lt;td&gt;{{nombre}}&lt;\/td&gt;\r\n                    &lt;td&gt;{{puntos}} puntos.&lt;\/td&gt;\r\n                &lt;\/tr&gt;\r\n                {{\/each}}\r\n            &lt;\/tbody&gt;\r\n        &lt;\/table&gt;\r\n    &lt;\/script&gt;<\/pre>\n<p>En la plantilla podemos observar los mecanismos de interacci\u00f3n con el contexto, a trav\u00e9s de las expresiones encerradas entre llaves. Si nos fijamos adem\u00e1s disponemos de alguna funcionalidad adicional como <span class=\"lang:ps decode:true crayon-inline \">#each<\/span>\u00a0 para recorrer un array (se denominan <em>built-in helpers<\/em>), aunque en el caso de este motor de plantillas son muy pocas ya que precisamente se centra solo en la sem\u00e1ntica, y no quiere \u00abengordar\u00bb con funcionalidad prefabricada y l\u00f3gica de aplicaci\u00f3n.<\/p>\n<p>La plantilla anterior, b\u00e1sicamente lo que har\u00eda es recorrer la lista de usuarios que alberga el array <span class=\"lang:js decode:true crayon-inline \">usuarios<\/span>\u00a0<strong>\u00a0<\/strong>y por cada elemento de dicho array, mostrar\u00eda la posici\u00f3n, el nombre y los puntos. Se aprecia como <span class=\"lang:js decode:true crayon-inline \">nombre<\/span>\u00a0 y <span class=\"lang:js decode:true crayon-inline \">puntos<\/span>\u00a0 son propiedades de cada objeto del array, sin embargo se ha hecho uso de un <em>helper<\/em> personalizado denominado <span class=\"lang:ps decode:true crayon-inline \">obtenerRanking<\/span>\u00a0 que lleva el control de posici\u00f3n en cada iteraci\u00f3n del bloque <span class=\"lang:ps decode:true crayon-inline \">#each<\/span>\u00a0.<\/p>\n<p>En realidad Handlebars cuenta con la variable <span class=\"lang:ps decode:true crayon-inline \">{{@index}}<\/span>\u00a0 dentro de un bloque <span class=\"lang:ps decode:true crayon-inline \">#each<\/span>\u00a0, pero esta comienza en 0 por lo que se ha hecho uso de un <em>helper<\/em> personalizado para lograr comenzar en 1, y de paso a\u00f1adir este elemento tan necesario en el uso de Handlebars en el mismo.<\/p>\n<h3>La librer\u00eda<\/h3>\n<p>La inclusi\u00f3n de la librer\u00eda se puede hacer desde una\u00a0CDN\u00a0de entre las existentes (por ejemplo <a href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/handlebars.js\/4.0.5\/handlebars.min.js\" target=\"_blank\">cdnjs.cloudflare.com<\/a><a href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/handlebars.js\/4.0.5\/handlebars.min.js\">cdnjs.cloudflare.com<\/a>) o descarg\u00e1ndola desde el sitio oficial (<a href=\"http:\/\/handlebarsjs.com\/installation.html\" target=\"_blank\">handlebarsjs.com<\/a>) para usarla localmente. Como en otras ocasiones, puede ser recomendable la combinaci\u00f3n de ambos m\u00e9todos para lograr optimizar la carga de la misma, con un c\u00f3digo como el siguiente:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/handlebars.js\/4.0.5\/handlebars.min.js\"&gt;&lt;\/script&gt;\r\n    &lt;script&gt;window.Handlebars || document.write('&lt;script src=\"js\/vendor\/handlebars-v4.0.5.js\"&gt;\\x3C\/script&gt;');&lt;\/script&gt;<\/pre>\n<h3>El ejemplo en funcionamiento<\/h3>\n<p>Para ver este ejemplo funcionando, pod\u00e9is hacer uso del proyecto en GitLab en el que se ha basado este tutorial, que est\u00e1 accesible simplemente accediendo a:\u00a0<a href=\"https:\/\/gitlab.com\/qmarcos\/handlebars-basics\" target=\"_blank\">https:\/\/gitlab.com\/qmarcos\/handlebars-basics<\/a><\/p>\n<h3>Aprendiendo\u00a0a usarlo online<\/h3>\n<p>Para ver en acci\u00f3n y poder probar este motor sin ni siquiera requerir una instalaci\u00f3n local, existe un recurso muy interesante que nos permite jugar con la mec\u00e1nica del mismo empleando todos los elementos que pueden necesitarse: plantilla, contexto, helpers&#8230; Este recurso se encuentra en\u00a0<a href=\"http:\/\/tryhandlebarsjs.com\" target=\"_blank\">http:\/\/tryhandlebarsjs.com<\/a><\/p>\n<h3>Referencias<\/h3>\n<p>A continuaci\u00f3n se recogen una serie de referencias relevantes para el aprendizaje b\u00e1sico de Handlebars, as\u00ed como la documentaci\u00f3n oficial.<\/p>\n<ul>\n<li><a href=\"http:\/\/handlebarsjs.com\/\" target=\"_blank\">http:\/\/handlebarsjs.com\/<\/a><\/li>\n<li><a href=\"http:\/\/code.tutsplus.com\/tutorials\/an-introduction-to-handlebars--net-27761\" target=\"_blank\">http:\/\/code.tutsplus.com\/tutorials\/an-introduction-to-handlebars&#8211;net-27761<\/a><\/li>\n<li><a href=\"http:\/\/blog.teamtreehouse.com\/getting-started-with-handlebars-js\" target=\"_blank\">http:\/\/blog.teamtreehouse.com\/getting-started-with-handlebars-js<\/a><\/li>\n<li><a href=\"http:\/\/blog.teamtreehouse.com\/handlebars-js-part-2-partials-and-helpers\" target=\"_blank\">http:\/\/blog.teamtreehouse.com\/handlebars-js-part-2-partials-and-helpers<\/a><\/li>\n<li><a href=\"http:\/\/blog.teamtreehouse.com\/handlebars-js-part-3-tips-and-tricks\" target=\"_blank\">http:\/\/blog.teamtreehouse.com\/handlebars-js-part-3-tips-and-tricks<\/a><\/li>\n<li><a href=\"http:\/\/javascriptissexy.com\/handlebars-js-tutorial-learn-everything-about-handlebars-js-javascript-templating\/\" target=\"_blank\">http:\/\/javascriptissexy.com\/handlebars-js-tutorial-learn-everything-about-handlebars-js-javascript-templating\/<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>En esta peque\u00f1o tutorial veremos un ejemplo b\u00e1sico del uso de handlebars, que nos permita descubrir y entender\u00a0las principales partes implicadas en el trabajo con este motor de plantillas del lado cliente, que se caracteriza por no a\u00f1adir pr\u00e1cticamente l\u00f3gica funcional a las plantillas, centr\u00e1ndose en al sem\u00e1ntica. Los principales elementos en el trabajo con &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/2016\/04\/16\/uso-de-handlebars\/\" class=\"more-link\">Seguir leyendo<span class=\"screen-reader-text\"> \u00abUso de handlebars\u00bb<\/span><\/a><\/p>\n","protected":false},"author":49,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[11,10],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-tutoriales","tag-javascript","tag-templates","entry"],"_links":{"self":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":4,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":85,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts\/13\/revisions\/85"}],"wp:attachment":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}