Après que l'application Angular est chargée, j'ai besoin que certains modèles soient disponibles hors ligne.
Quelque chose comme ça serait idéal:
$routeProvider
.when('/p1', {
controller: controller1,
templateUrl: 'Template1.html',
preload: true
})
Il existe un service de cache de modèles : $ templateCache qui peut être utilisé pour précharger des modèles dans un module javascript.
Par exemple, tiré des documents:
var myApp = angular.module('myApp', []);
myApp.run(function($templateCache) {
$templateCache.put('templateId.html', 'This is the content of the template');
});
Il y a même une tâche de grognement pour pré-générer un module javascript à partir de fichiers html: grunt-angular-templates
Une autre façon, peut-être moins flexible, utilise des modèles en ligne , par exemple, en ayant une balise de script comme celle-ci dans votre index.html:
<script type="text/ng-template" id="templates/Template1.html">template content</script>
signifie que le modèle peut être traité ultérieurement de la même manière qu'une véritable URL dans votre configuration d'itinéraire (templateUrl: 'templates/Template1.html'
)
Ceci est un ajout à la réponse de @gargc.
Si vous ne souhaitez pas utiliser la balise de script pour spécifier votre modèle et souhaitez charger des modèles à partir de fichiers, vous pouvez faire quelque chose comme ceci:
myApp.run(function ($templateCache, $http) {
$http.get('Template1.html', { cache: $templateCache });
});
myApp.config(function ($locationProvider, $routeProvider) {
$routeProvider.when('/p1', { templateUrl: 'Template1.html' })
});
Je pense avoir une solution légèrement améliorée à ce problème basée sur l'approche de Raman Savitski, mais il charge les modèles de manière sélective. Il permet en fait la syntaxe d'origine qui a été demandée comme ceci:
$routeProvider.when('/p1', { controller: controller1, templateUrl: 'Template1.html', preload: true })
Cela vous permet de simplement décorer votre itinéraire et de ne pas avoir à vous soucier de mettre à jour une autre configuration de préchargement ailleurs.
Voici le code qui s'exécute au démarrage:
angular.module('MyApp', []).run([
'$route', '$templateCache', '$http', (function ($route, $templateCache, $http) {
var url;
for (var i in $route.routes) {
if ($route.routes[i].preload) {
if (url = $route.routes[i].templateUrl) {
$http.get(url, { cache: $templateCache });
}
}
}
})
]);
Précharge tous les modèles définis dans les routes de module.
angular.module('MyApp', [])
.run(function ($templateCache, $route, $http) {
var url;
for(var i in $route.routes)
{
if (url = $route.routes[i].templateUrl)
{
$http.get(url, {cache: $templateCache});
}
}
})
si vous enveloppez chaque modèle dans une balise de script, par exemple:
<script id="about.html" type="text/ng-template">
<div>
<h3>About</h3>
This is the About page
Its cool!
</div>
</script>
Concatène tous les modèles en 1 gros fichier. Si vous utilisez Visual Studio 2013, téléchargez les éléments essentiels du Web - il ajoute un menu contextuel pour créer un ensemble HTML
Ajoutez le code que ce type a écrit pour changer le service angular $ templatecache - c'est seulement un petit morceau de code et ça marche :-)
https://Gist.github.com/vojtajina/3354046
Votre routes templateUrl devrait ressembler à ceci:
$routeProvider.when(
"/about", {
controller: "",
templateUrl: "about.html"
}
);