EDITAR: Esta respuesta es antigua y obsoleta. Lo eliminaría, pero es la respuesta "aceptada". Inyectaré mi opinión en su lugar.
No recomendaría hacer esto nunca más. En cambio, separaría todas las plantillas en archivos HTML individuales. Algunos sugerirían cargarlos de forma asíncrona (Require.js o una especie de caché de plantillas). Eso funciona bien en proyectos pequeños, pero en proyectos grandes con muchas plantillas, te encuentras haciendo un montón de pequeñas solicitudes asíncronas en la carga de la página que realmente no me gusta. (ugh ... ok, puedes solucionarlo con Require.js precompilando tus dependencias iniciales con r.js, pero para las plantillas, todavía me parece mal)
Me gusta usar una tarea gruñona (grunt-contrib-jst) para compilar todas las plantillas HTML en un solo archivo templates.js e incluir eso. Obtiene lo mejor de todos los mundos IMO ... las plantillas viven en un archivo, la compilación de dichas plantillas se realiza en el momento de la compilación (no en tiempo de ejecución) y no tiene cien pequeñas solicitudes asíncronas cuando se inicia la página.
Todo lo que hay debajo es basura
Para mí, prefiero la simplicidad de incluir un archivo JS con mi plantilla. Entonces, podría crear un archivo llamado view_template.js que incluye la plantilla como una variable:
app.templates.view = " \
<h3>something code</h3> \
";
Luego, es tan simple como incluir el archivo de script como uno normal y luego usarlo en su vista:
template: _.template(app.templates.view)
Yendo un paso más allá, en realidad uso coffeescript, por lo que mi código se parece más a esto y evito los caracteres de escape al final de la línea:
app.templates.view = '''
<h3>something code</h3>
'''
El uso de este enfoque evita la acumulación en require.js donde realmente no es necesario.
Aquí hay una solución simple:
Usar "async: false" aquí no es una mala manera porque, en cualquier caso, debe esperar hasta que se cargue la plantilla.
Entonces, la función "render"
[Estoy editando la respuesta en lugar de dejar un comentario porque creo que esto es importante.]
si las plantillas no se muestran en la aplicación nativa , y usted ve
HIERARCHY_REQUEST_ERROR: DOM Exception 3
, mire la respuesta de Dave Robinson a ¿Qué puede causar exactamente un error "HIERARCHY_REQUEST_ERR: DOM Exception 3"? .Básicamente, debes agregar
a la solicitud $ .ajax.
fuente
dataType: 'html'
a nuestra solicitud ajax, por si acaso?Este mixin permite generar una plantilla externa mediante subrayado de manera muy sencilla:
_.templateFromUrl(url, [data], [settings])
. Método API es casi lo mismo que el subrayado _.template () . Almacenamiento en caché incluido.Uso:
fuente
No quería usar require.js para esta tarea simple, así que usé la solución de koorchik modificada.
¿Por qué agregar plantillas al documento, en lugar de almacenarlas en un objeto javascript? Debido a que en la versión de producción me gustaría generar un archivo html con todas las plantillas ya incluidas, por lo que no necesitaré hacer ninguna solicitud adicional de ajax. Y al mismo tiempo, no necesitaré realizar ninguna refactorización en mi código, ya que uso
en mis puntos de vista Backbone.
fuente
async: false
ahora está en desusoasync: false
está en desuso, mejoré la respuesta al agregar lacomplete
devolución de llamada.Esto podría estar ligeramente fuera de tema, pero podría usar Grunt (http://gruntjs.com/), que se ejecuta en node.js (http://nodejs.org/, disponible para todas las plataformas principales) para ejecutar tareas desde línea de comando. Hay un montón de complementos para esta herramienta, como un compilador de plantillas, https://npmjs.org/package/grunt-contrib-jst . Consulte la documentación en GitHub, https://github.com/gruntjs/grunt-contrib-jst . (También deberá comprender cómo ejecutar el administrador de paquetes de nodos, https://npmjs.org/ . No se preocupe, es increíblemente fácil y versátil).
Luego puede mantener todas sus plantillas en archivos html separados, ejecutar la herramienta para precompilarlas todas con subrayado (lo que creo que es una dependencia para el complemento JST, pero no se preocupe, el administrador de paquetes de nodo instalará automáticamente las dependencias por usted).
Esto compila todas sus plantillas en un script, digamos
Al cargar el script se establecerá un global - "JST" por defecto - que es una matriz de funciones, y se puede acceder de esta manera:
JST['templates/listView.html']()
que sería similar a
si coloca el contenido de esa etiqueta de script en (templates /) listView.html
Sin embargo, el verdadero truco es este: Grunt viene con esta tarea llamada 'watch', que básicamente supervisará los cambios en los archivos que ha definido en su archivo grunt.js local (que es básicamente un archivo de configuración para su proyecto Grunt, en javascript ) Si tienes gruñido comienza esta tarea por ti, escribiendo:
desde la línea de comandos, Grunt supervisará todos los cambios que realice en los archivos y ejecutará automáticamente todas las tareas que haya configurado en ese archivo grunt.js si detecta cambios, como el tarea jst descrita anteriormente. Edite y guarde sus archivos, y todas sus plantillas se vuelven a compilar en un solo archivo js, incluso si están distribuidas en varios directorios y subdirectorios.
Se pueden configurar tareas similares para alinear su javascript, ejecutar pruebas, concatenar y minimizar / uglificar sus archivos de script. Y todo puede estar vinculado a la tarea de observación, por lo que los cambios en sus archivos desencadenarán automáticamente una nueva 'compilación' de su proyecto.
Lleva algo de tiempo configurar las cosas y entender cómo configurar el archivo grunt.js, pero vale la pena el tiempo invertido, y no creo que alguna vez vuelvas a una forma de trabajo previa al gruñido.
fuente
template: JST['test.html']()
no parece estar cargando los datos desde JST :( (vea mi pregunta aquí: stackoverflow.com/questions/29723392/… )Creo que esto es lo que podría ayudarte. Todo en la solución gira en torno a la
require.js
biblioteca, que es un cargador de módulos y archivos JavaScript.El tutorial en el enlace de arriba muestra muy bien cómo se podría organizar un proyecto de red troncal. También se proporciona una implementación de muestra . Espero que esto ayude.
fuente
Me interesé en la plantilla de JavaScript y ahora estoy dando los primeros pasos con la red troncal. Esto es lo que se me ocurrió y parece funcionar bastante bien.
fuente
get
función, probablemente devolvería el$.ajax
mismo para que devuelva un objeto de promesa, en caso de que su plantilla no responda de inmediato.Tuve que establecer el tipo de datos en "texto" para que funcione para mí:
fuente
Encontré una solución que me funciona usando jQuery.
Agrego el código de plantilla de subrayado, con el método jQuery.load (), al archivo html principal.
Una vez que está allí, lo estoy usando para generar las plantillas. ¡Todo debe suceder sincrónicamente!
El concepto es:
Tengo un código de plantilla de mapa de subrayado:
Y puse ese código en un archivo llamado map-template.html
Después de eso, creo un contenedor para los archivos de plantilla.
Luego incluyo ese archivo en mi archivo html principal de esta manera.
En cabeza:
Salud.
fuente
Sé que esta pregunta es muy antigua, pero surgió como el primer resultado en una búsqueda en Google de plantillas de subrayado ajax.
Estaba cansado de no encontrar una buena solución para esto, así que creé el mío:
https://github.com/ziad-saab/underscore-async-templates
Además de cargar plantillas de subrayado con AJAX, agrega la funcionalidad <% include%>. Espero que pueda ser útil para alguien.
fuente
Estaba un poco incómodo forzando a jQuery a funcionar sincrónicamente, así que modifiqué el ejemplo sincrónico anterior usando promesas. Es casi lo mismo, pero se ejecuta de forma asincrónica. Estoy usando plantillas hbs en este ejemplo:
Luego, para usar el html representado:
NOTA: Según lo discutido por otros, sería preferible compilar todas las plantillas en un solo archivo templates.js y cargarlo al principio en lugar de tener muchas llamadas AJAX sincrónicas pequeñas para obtener plantillas cuando se carga la página web.
fuente
Advertencia delantera: aquí hay dragones:
Menciono el enfoque que se muestra a continuación simplemente para ayudar a aquellos que luchan por hacer que las pilas ASP.NET (y marcos similares) funcionen en armonía con el ecosistema de js-libs. No hace falta decir que esta no es una solución genérica. Una vez dicho esto ...
/ endforwardwarning
Si está utilizando ASP.NET, puede externalizar sus plantillas simplemente colocándolas dentro de una o más vistas parciales propias. Aka dentro de su .cshtml:
Dentro de su template.cshtml:
Y ahora puedes usar la plantilla como de costumbre:
Espero que este enfoque tan obvio ayude a alguien a ahorrar una hora de rascarse la cabeza.
fuente