Estoy tratando de desarrollar una forma simple de crear plantillas en JavaScript. La idea básica es que tengo HTML en una página que representa la UI de un objeto en JavaScript y las variables en ese HTML que se reemplazan con las propiedades del objeto JavaScript. Piense en ello como una técnica para enlazar objetos JavaScript a presentaciones HTML.Mejora de una técnica de plantillas de JavaScript simple
¿Alguna crítica? ¿Debo usar fragmentos de documentos de alguna manera? Básicamente, estoy buscando una revisión del código en este caso. Agradecería cualquier comentario. (Tenga en cuenta que esto debería ser independiente del marco.) Aquí hay un ejemplo de trabajo.
<html>
<body>
<!-- where templates will be injected into -->
<div id="thumbContainer"></div>
<!-- template used for thumbnails -->
<div id="thumbTemplate" style="display:none">
<div class="thumb">
<div>${caption}</div>
<div>${image}</div>
</div>
</div>
</body>
<script type="text/javascript">
(function() {
// Cache the templates' markup in case that template is used again
var cache = [];
// Magic
document.templatized = function(templateId, properties) {
// Get the template from cache or get template and add to cache
var template = cache[templateId] || (function() {
cache[templateId] = document.getElementById(templateId).innerHTML;
return cache[templateId];
})();
// Create the DOM elements that represent the markup
var shell = document.createElement('div');
shell.innerHTML = template.replace(/\$\{(\w+)\}/g, function(match, key){
return properties[key] || match;
});
// Return those DOM elements
return shell.children[0].cloneNode(true);
};
})();
// Create DOM elements with values bound to thumbnail object
var thumb = document.templatized('thumbTemplate', {
caption: 'Summer',
image: (function() {
// More complicated logic that requires conditions here...
return '<img src="test.png" />';
})()
});
// Display on page by inserting into DOM
document.getElementById('thumbContainer').appendChild(thumb);
</script>
+1 para // magia – cherouvim
¡Jaja, gracias! :) – JamesBrownIsDead