Otro terreno que también ha sido portado en varias ocasiones es el de los patrones o templates, muy relacionado con las vistas en la distribución MVC. Contando con un sistema de este tipo podemos guardar segmentos de código HTML que, procesados desde Javascript y combinándolos con variables, permiten personalizar las vistas y reaccionar a las entrada del usuario directamente desde el cliente, eliminando el tiempo necesario para conectar con el servidor y que éste procese la información antes de enviarla de vuelta.
Se podría decir que esta es una pieza conveniente para llegar más allá de lo que supone Ajax. Si con Ajax es posible alcanzar el servidor sin perder el tiempo en tener que recargar la página, con esta técnica evitamos el tener que acudir al servidor (siempre que esto sea posible) ya sea cacheando la información en local (Google Gears o Yahoo! BrowserPlus) o manteniendo ya una conexión abierta con el servidor mediante Comet para reducir el tiempo de respuesta.
A continuación pueden verse unas cuantas de estas librerías:
- Javascript Micro-Templating de John Resig.
<% for ( var i = 0; i < users.length; i++ ) { %> <li><a href="<%=users[i].url%>"><%=users[i].name%></a></li> <% } %>
var results = document.getElementById("results").innerHTML = tmpl("item_tmpl", dataObject);
<textarea id="cart_jst" style="display:none;"> Hello ${customer.first} ${customer.last}. </textarea>
var data = { customer : { first: "John", last: "Public", level: "gold" } } var result = TrimPath.processDOMTemplate("cart_jst", data);
BlogController = function() {} BlogController.prototype.show = function(req, res) { res.blog = Blog.find('first', req['objId']); res.render('blog/show'); }
classes
del CSS y utiliza JSON para indicar los datos a reemplazar:
<div id="hello"> Hello <span class="who">World</span> </div>
$('#hello').autoRender({ "who": "Mary" });
var data={ title: 'Cleaning Supplies' supplies: ['mop', 'broom', 'duster'] } html = new EJS({url: '/template.ejs'}).render(data) new EJS({url:'/todo.ejs'}).update('todo','/todo.json')
<ul> <% for(var i=0; i<li><%= supplies[i] %></li> <% } %> </ul>
[foreach('folder'){] [var c = count('file')] Folder {@name} has [%c] file[if(c>1)%'s']\n [sort('file','text()',sort_alpha){]\s File: [%$'text()'.toLowerCase();] [if(!last)%','] [}]\n [}]
<div class="comments"> <div id="comments-template"> <div class="comment"> <div class="_ top"> <a class="_" href="{website}">{name}</a> said <a class="_" title="{time}"></a>: </div> <div class="text"></div> </div> </div> </div>
var data = { comment: [{ date: "2008-09-07 12:28:33", name: "David Beckham", website: "beckham.com", text: "I watched the euro finals on tv..." }] }; var template = new Template('comments-template'); $('.comments').expand(template, data); // con jQuery
<script type="text/html" id="item_tmpl"> Este texto <strong>NO</strong> aparecería en la página </script>