2012-09-21 19 views
8

Sto utilizzando knockout.js con il relativo sistema di template integrato. Mi definisco come i modelli così:knockout.js caricamento dei modelli in fase di esecuzione

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

Ho quindi utilizzare l'id del modello in modo da avere questo come parte dello script è una necessità.

Ho un buon numero di questi modelli nella mia applicazione di pagina singola e mi sono recentemente spostato usando require.js per caricare gli script che sono richiesti solo quando sono richiesti. Mi piacerebbe fare lo stesso con i modelli, preferibilmente usando require.js in modo che i miei moduli potessero elencare i modelli come dipendenze.

Come posso fare?

risposta

10

Uso il plugin di testo require.js: http://requirejs.org/docs/api.html#text. Una volta ottenuto il testo del modello, è possibile aggiungerlo alla pagina in un nuovo tag script (con un tipo che è text/html o qualcosa di diverso da javascript).

In realtà ho utilizzato un motore di modello modificato che gestisce direttamente le stringhe, in modo che non sia necessario aggiungere tag di script aggiuntivi alla pagina.

Il mio codice simile a:

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; 
      }); 
     } 
    }; 

Lo stringTemplateEngine che uso assomiglia a: https://github.com/rniemeyer/SamplePresentation/blob/master/js/stringTemplateEngine.js

+1

Grazie Ryan, che funziona bene. Quello stringTemplateEngine è fantastico! Ho avvolto il processo in un modulo obbligatorio in modo da non avere lo stesso codice boilerplate ovunque. https://github.com/aranm/ko.loadTemplateUsingRequireText. –

+0

Questo approccio può essere utilizzato insieme al koExternalTemplateEngine (https://github.com/ifandelse/Knockout.js-External-Template-Engine)? Oppure non è possibile avere più origini di modelli personalizzati? – daedalus28

+0

Puoi chiarire che cosa vuoi che sia il risultato finale? Vuoi che il motore di template esterno gestisca il recupero del template, ma poi non lo accluda come script? –

Problemi correlati