EDIT: Cette réponse est ancienne et dépassée. Je le supprimerais, mais c'est la réponse «acceptée». Je vais plutôt injecter mon avis.
Je ne recommanderais plus de faire ça. Au lieu de cela, je séparerais tous les modèles en fichiers HTML individuels. Certains suggéreraient de les charger de manière asynchrone (Require.js ou une sorte de cache de modèle). Cela fonctionne bien sur les petits projets, mais sur les grands projets avec beaucoup de modèles, vous vous retrouvez à faire une tonne de petites requêtes asynchrones lors du chargement de la page, ce que je n'aime vraiment pas. (ugh ... ok, vous pouvez le contourner avec Require.js en pré-compilant vos dépendances initiales avec r.js, mais pour les modèles, cela me semble toujours faux)
J'aime utiliser une tâche grunt (grunt-contrib-jst) pour compiler tous les modèles HTML dans un seul fichier templates.js et l'inclure. Vous obtenez le meilleur de tous les modèles IMO du monde ... les modèles vivent dans un fichier, la compilation desdits modèles se produit au moment de la construction (pas au moment de l'exécution), et vous n'avez pas cent petites requêtes asynchrones lorsque la page démarre.
Tout ce qui est en dessous est indésirable
Pour moi, je préfère la simplicité d'inclure un fichier JS avec mon modèle. Donc, je pourrais créer un fichier appelé view_template.js qui inclut le modèle en tant que variable:
app.templates.view = " \
<h3>something code</h3> \
";
Ensuite, c'est aussi simple que d'inclure le fichier de script comme un fichier normal et de l'utiliser ensuite dans votre vue:
template: _.template(app.templates.view)
Pour aller plus loin, j'utilise en fait coffeescript, donc mon code ressemble plus à ceci et évite les caractères d'échappement de fin de ligne:
app.templates.view = '''
<h3>something code</h3>
'''
L'utilisation de cette approche évite d'ajouter require.js là où ce n'est vraiment pas nécessaire.
Voici une solution simple:
Utiliser "async: false" ici n'est pas un mauvais moyen car dans tous les cas il faut attendre que le template soit chargé.
Donc, la fonction "render"
[Je modifie la réponse au lieu de laisser un commentaire parce que je pense que c'est important.]
si les modèles n'apparaissent pas dans l' application native , et que vous voyez
HIERARCHY_REQUEST_ERROR: DOM Exception 3
, regardez la réponse de Dave Robinson à Qu'est-ce qui peut exactement provoquer une erreur "HIERARCHY_REQUEST_ERR: DOM Exception 3"? .En gros, vous devez ajouter
à la requête $ .ajax.
la source
dataType: 'html'
à notre requête ajax, juste au cas où?Ce mixin vous permet de rendre modèle externe à l' aide de soulignement de manière très simple:
_.templateFromUrl(url, [data], [settings])
. L'API de méthode est presque la même que _.template () de Underscore . Mise en cache incluse.Usage:
la source
Je ne voulais pas utiliser require.js pour cette tâche simple, j'ai donc utilisé la solution modifiée de koorchik.
Pourquoi ajouter des modèles au document, plutôt que de les stocker dans un objet javascript? Parce que dans la version de production, je voudrais générer un fichier html avec tous les modèles déjà inclus, donc je n'aurai pas besoin de faire de requêtes ajax supplémentaires. Et en même temps, je n'aurai pas besoin de refactoriser mon code, car j'utilise
dans mes vues Backbone.
la source
async: false
est obsolète maintenantasync: false
est obsolète, j'ai amélioré la réponse, en ajoutant uncomplete
rappel.Cela peut être légèrement hors sujet, mais vous pouvez utiliser Grunt (http://gruntjs.com/) - qui s'exécute sur node.js (http://nodejs.org/, disponible pour toutes les principales plates-formes) pour exécuter des tâches depuis le ligne de commande. Il existe de nombreux plugins pour cet outil, comme un compilateur de modèles, https://npmjs.org/package/grunt-contrib-jst . Consultez la documentation sur GitHub, https://github.com/gruntjs/grunt-contrib-jst . (Vous devrez également comprendre comment exécuter le gestionnaire de packages de nœuds, https://npmjs.org/ . Ne vous inquiétez pas, c'est incroyablement facile et polyvalent.)
Vous pouvez ensuite conserver tous vos modèles dans des fichiers html séparés, exécuter l'outil pour les précompiler tous en utilisant un trait de soulignement (ce qui, je crois, est une dépendance du plugin JST, mais ne vous inquiétez pas, le gestionnaire de paquets de nœuds installera automatiquement les dépendances pour vous).
Cela compile tous vos modèles en un seul script, par exemple
Le chargement du script définira un global - "JST" par défaut - qui est un tableau de fonctions, et peut être consulté comme ceci:
JST['templates/listView.html']()
qui serait similaire à
si vous mettez le contenu de cette balise de script dans (templates /) listView.html
Cependant, le vrai kicker est le suivant: Grunt est livré avec cette tâche appelée `` watch '', qui surveillera essentiellement les modifications apportées aux fichiers que vous avez définis dans votre fichier local grunt.js (qui est essentiellement un fichier de configuration pour votre projet Grunt, en javascript ). Si vous avez grogné, lancez cette tâche pour vous, en tapant:
à partir de la ligne de commande, Grunt surveillera toutes les modifications que vous apportez aux fichiers et exécutera automatiquement toutes les tâches que vous avez configurées pour cela dans ce fichier grunt.js s'il détecte des changements - comme la tâche jst décrite ci-dessus. Modifiez puis enregistrez vos fichiers, et tous vos modèles se recompilent dans un seul fichier js, même s'ils sont répartis sur un certain nombre de répertoires et de sous-répertoires.
Des tâches similaires peuvent être configurées pour linter votre javascript, exécuter des tests, concaténer et minimiser / uglifier vos fichiers de script. Et tout peut être lié à la tâche de surveillance, de sorte que les modifications apportées à vos fichiers déclencheront automatiquement une nouvelle «construction» de votre projet.
Il faut un certain temps pour configurer les choses et comprendre comment configurer le fichier grunt.js, mais cela vaut bien le temps investi, et je ne pense pas que vous reviendrez jamais à une façon de travailler pré-grognement
la source
template: JST['test.html']()
il ne semble pas charger les données depuis JST :( (voir ma question ici: stackoverflow.com/questions/29723392/… )Je pense que c'est ce qui pourrait vous aider. Tout dans la solution tourne autour de la
require.js
bibliothèque qui est un fichier JavaScript et un chargeur de module.Le tutoriel sur le lien ci-dessus montre très bien comment un projet de base pourrait être organisé. Un exemple d'implémentation est également fourni. J'espère que cela t'aides.
la source
Je me suis intéressé à la création de modèles javascript et maintenant je fais les premiers pas avec le backbone. C'est ce que j'ai trouvé et semble fonctionner plutôt bien.
la source
get
fonction, je retournerais probablement le$.ajax
lui - même afin qu'il renvoie un objet de promesse au cas où votre modèle ne répondrait pas tout de suite.J'ai dû définir le type de données sur "texte" pour que cela fonctionne pour moi:
la source
J'ai trouvé une solution qui fonctionne pour moi en utilisant jQuery.
J'ajoute le code du modèle de soulignement, avec la méthode jQuery.load (), au fichier html principal.
Une fois qu'il est là, je l'utilise pour générer les modèles. Tout doit se produire de manière synchrone!
Le concept est:
J'ai un code de modèle de carte de soulignement:
Et j'ai mis ce code dans un fichier appelé map-template.html
Après cela, je crée un wrapper pour les fichiers de modèle.
Ensuite, j'inclus ce fichier dans mon fichier html principal comme ça.
En tête:
À votre santé.
la source
Je sais que cette question est vraiment ancienne, mais elle est apparue comme le premier résultat d'une recherche Google pour les modèles de soulignement ajax.
J'étais fatigué de ne pas trouver une bonne solution pour cela alors j'ai créé la mienne:
https://github.com/ziad-saab/underscore-async-templates
En plus de charger des modèles de soulignement à l'aide d'AJAX, il ajoute la fonctionnalité <% include%>. J'espère que cela pourra être utile à quelqu'un.
la source
J'étais un peu inquiet de forcer jQuery à fonctionner de manière synchrone, j'ai donc modifié l'exemple synchrone précédent en utilisant des promesses. C'est à peu près la même chose, mais fonctionne de manière asynchrone. J'utilise des modèles hbs dans cet exemple:
Ensuite, pour utiliser le html rendu:
REMARQUE: comme indiqué par d'autres, il serait préférable de compiler tous les modèles dans un seul fichier templates.js et de le charger au début plutôt que d'avoir de nombreux petits appels AJAX synchrones pour obtenir des modèles lorsque la page Web se charge.
la source
Avertissement avant - Voici les dragons:
Je mentionne l'approche présentée ci-dessous simplement pour aider ceux qui ont du mal à faire en sorte que les piles ASP.NET (et les frameworks similaires) fonctionnent harmonieusement avec l'écosystème de js-libs. Il va sans dire que ce n'est pas une solution générique. Ayant dit cela ...
/ endforwardwarning
Si vous utilisez ASP.NET, vous pouvez externaliser vos modèles simplement en les plaçant dans une ou plusieurs vues partielles qui leur sont propres. Aka dans votre .cshtml:
Dans votre template.cshtml:
Et maintenant, vous pouvez utiliser le modèle comme d'habitude:
J'espère que cette approche insaisissable aidera quelqu'un à économiser une heure de se gratter la tête.
la source