2012-09-21 23 views
8

Estoy usando knockout.js con su sistema de plantillas incorporado. Me defino como las plantillas de modo:knockout.js cargando plantillas en tiempo de ejecución

<script type="text/html" id="subjectItemView"> 
    <span class="name" data-bind="text: subjectName" /> 
</script> 

entonces utilizar el ID de la plantilla así que tener esto como parte de la secuencia de comandos es una necesidad.

Tengo algunas de estas plantillas en mi aplicación de una sola página y recientemente pasé al uso de require.js para cargar los scripts que se requieren solo cuando son necesarios. Me gustaría hacer lo mismo con las plantillas, preferiblemente usando require.js para que mis módulos puedan listar las plantillas como dependencias.

¿Cómo puedo hacer esto?

Respuesta

10

Uso el complemento de texto require.js: http://requirejs.org/docs/api.html#text. Una vez que tenga el texto de la plantilla, puede agregarlo a la página en una nueva etiqueta de script (con un tipo que es text/html o algo diferente a javascript).

He estado utilizando un motor de plantillas modificado que maneja cadenas directamente, por lo que no es necesario agregar etiquetas de script adicionales a la página.

Mi código es algo como:

this.activate = function() { 
     //load view model from the server 
     if (!this.loaded) { 
      require(["modules/" + name, "text!../templates/" + self.template + ".html"], function(Module, template) { 
       ko.templates[self.template] = template; 
       self.data(typeof Module === "function" ? new Module() : Module); 
       self.loaded = true; 
      }); 
     } 
    }; 

El stringTemplateEngine que utilizo el siguiente aspecto: https://github.com/rniemeyer/SamplePresentation/blob/master/js/stringTemplateEngine.js

+1

Gracias Ryan, que funciona bien. ¡Ese stringTemplateEngine es genial! Envolví el proceso en un módulo requerido, así que no tengo el mismo código repetitivo en todas partes. https://github.com/aranm/ko.loadTemplateUsingRequireText. –

+0

¿Se puede usar este enfoque junto con koExternalTemplateEngine (https://github.com/ifandelse/Knockout.js-External-Template-Engine)? ¿O no es posible tener múltiples fuentes de plantillas personalizadas? – daedalus28

+0

¿Puedes aclarar cuál es el resultado final? ¿Desea que el motor de plantillas externo maneje la recuperación de la plantilla, pero luego no la anexe como un script? –

Cuestiones relacionadas