2012-05-02 12 views
16

¿Es posible almacenar una plantilla jsRender en un archivo separado?Almacenar una plantilla jsRender en un archivo js diferente

Quiero almacenarlo en un archivo separado y hacer una referencia en mi página.

algo como esto

<script id="templateName" type="text/x-jsrender" src="thisIsTheTemplate.js"></script> 

voy a apreciar cualquier commemnts o sugerencias.

Gracias

Respuesta

19

Sí, se puede lograr esto (yo uso esto cada vez).

vamos a suponer que usted tiene sus plantillas en una carpeta template y se llama, por ejemplo _productDetails.tmpl.html

en su página utiliza jQuery $.get() para tirar de él y cargar en la plantilla, como:

var renderExternalTmpl = function(item) { 

    var file = '../templates/_' + item.name + '.tmpl.html'; 
    $.when($.get(file)) 
    .done(function(tmplData) { 
     $.templates({ tmpl: tmplData }); 
     $(item.selector).html($.render.tmpl(item.data)); 
    });  
} 

y se pasa un objeto bruja item contendrá los 3 propiedades, como:

renderExternalTmpl({ name: 'productDetails', selector: '#items', data: {} }) 

Usted puede tener una buena utilidades clase para mantener todo esto:

var my = my || {}; 
my.utils = (function() { 
    var getPath = function(name) { 
     return '../templates/_' + name + '.tmpl.html'; 
    }, 
    renderExtTemplate = function(item) { 

     var file = getPath(item.name); 
     $.when($.get(file)) 
     .done(function(tmplData) { 
      $.templates({ tmpl: tmplData }); 
      $(item.selector).html($.render.tmpl(item.data)); 
     });  
    }; 

    return { 
     getPath: getPath, 
     renderExtTemplate: renderExtTemplate 
    }; 
}); 

y se puede llamar fácilmente my.utils.renderExtTemplate(item);

+0

¿Es una buena idea para enviar una petición http cada vez que quiera hacer una plantilla? – Stefan

+2

@Stefan Lo hago, solo uso 'cache: true' si desea que el navegador guarde en caché la plantilla para que no tenga que enviarla cada solicitud. – balexandre

+6

¿Por qué simplemente no funciona el atributo 'src' del elemento' ')? Eso sería tan limpio, hermoso e intuitivo. –

2

poco me encontré con este problema a mí mismo. Después de examinar el código jsRender y estudiar otras bibliotecas de JavaScript, decidí escribir mi propia biblioteca que simplificaría la carga de plantillas externas para que se pudieran adjuntar plantillas a una página html usando la etiqueta <link> y renderizarlas simplemente incluyendo el archivo .js . Si desea comprobarlo, he publicado el código en GitHub con ejemplos:

https://github.com/stevenmhunt/tmpl.loader

Esta biblioteca trabaja con jsRender, así como cualquier código capaz de procesar una plantilla.

¡Disfrútalo!

+0

404 No encontrado ... –

+0

@ Maxy-B: Gracias por el mensaje, he cambiado mi nombre de usuario github recientemente. Olvidé que esta publicación estaba abierta, ¡gracias por el aviso! Si tiene alguna dificultad con la biblioteca, hágamelo saber. –

1

En caso de que intente cargar plantillas externas desde un archivo local, como yo, permítame ahorrarle un poco de frustración. No use jQuery $.get() como se recomienda en balexandre's answer.

Use $.ajax(), y establezca async: true y dataType: text, de lo contrario, le dará un error: elem.getAttribute is not a function. Ver mi respuesta al Error when loading jsrender templates through AJAX para más detalles.

0

En mi experiencia, no necesita trabajar con ese problema, solo necesita agregar la plantilla a la página antes de usarla. ver el código a continuación.

<div id="all_template"></div> 
<script> 
var file = '/tmpl/all.tmpl.html'; 
$.ajax({ 
    url: file, 
    async: false, 
    type : "GET", 
    dataType: 'text', 
    cache: true, 
    success: function(contents) 
    { 
    $("#all_template").append(contents);//append all your template to the div 
    } 
}); 
</script> 
<script> 
var data = {}; 
$('#js-template').render(data);//use it as the same old way 
</script> 

de esta manera, no es necesario solicitar un archivo de cada ajax desea reproducir una plantilla JS

1

Aquí es una función que escribí para cargar una o más plantillas externas a la vez. También almacena en caché las plantillas, de modo que si una ya está cargada, no volverá a cargarse.

function loadTemplates() { 
    var toLoad = [], 
     loadAll = $.Deferred(); 

    $.each(arguments, function(i, templateName) { 
     var filepath = '/path/to/templates/' + templateName + '.html', 
      loadTemplate = $.Deferred(); 

     toLoad.push(loadTemplate); 

     if ($.templates[templateName]) { 
      loadTemplate.resolve(); 
     } else { 
      $.get(filepath , function(html) { 
       var newTemplate = {}; 
       newTemplate[templateName] = html; 
       $.templates(newTemplate); 
      }).fail(function() { 
       throw 'Could not load template at '+filepath; 
      }).done(function() { 
       loadTemplate.resolve(); 
      }); 
     } 
    }) 

    $.when.apply($, toLoad).done(function() { 
     loadAll.resolve(); 
    }); 

    return loadAll; 
} 

Se usa así:

loadTemplates('modal','itemDetail', 'itemsList').done(function() { 
    // do stuff when all templates are loaded 
    $('#viewItemDetail').on('click',function() { 
     $.render.itemDetail({ 
      id:'123', 
      name:'Cool Thing', 
      description:'This thing is really cool.' 
     }); 
    }); 
}); 
+0

Si se editó la plantilla. ¿se renueva el caché? –

+0

Puede establecer la caché en falso en el get. https://stackoverflow.com/questions/8841425/how-to-set-cache-false-in-jquery-get-call – johnpolacek

Cuestiones relacionadas