Je remarque que sur un rafraîchissement complet de mon application angulaire, les transitions de l'état (j'utilise l'UI-routeur, mais peuvent également être similaires à un routage angulaire natif également) ont un léger retard sur la première visite car le navigateur a une demande d'accès récupérer le partiel HTML associé à cet état donné. Toutes les visites ultérieures sont fondamentalement instantanées, mais je veux savoir s'il existe un moyen de dire angulaire de pré-charger toutes les partielles nécessaires lors de la première arrivée à la page? P>
Ne faites-ils pas cela parce que finalement trop de partiels utiliseraient trop de bande passante si elle est extraite en parallèle? P>
3 Réponses :
Vous pouvez mettre ces partiels à l'intérieur d'une étiquette de script et placer dans votre page HTML principale afin qu'ils soient tous chargés à l'avance. Vous pouvez également les charger dans le bloc d'exécution de votre application et les mettre dans le ou obtenez-le du serveur si ce n'est pas en ligne: p>
$ templateCache code>: p>
$ templatecache.put ('template.html', ' mon modèle h1>'); code> p>
$ http.get ('template.html', {cache: $ templatecache}); code> p>
Hey Désolé n'a pas vu votre réponse. Je vais probablement utiliser ce dernier et simplement obtenir les partiels lors de l'initialisation des applications. Cela a le plus de sens. Merci!
Pour précharger des modèles à l'initialisation de l'application, vous pouvez utiliser:
angular
.module('app')
.run(['$state', '$templateCache', '$http',
function ($state, $templateCache, $http) {
angular.forEach($state.get(), function (state, key) {
if (state.templateUrl !== undefined && state.preload !== false) {
$http.get(state.templateUrl, {cache: $templateCache});
}
});
}
]);
Voici une solution qui va faire exactement cela et traitera toutes les vues définies.
run(['$state', '$templateCache', '$http', function($state, $templateCache, $http) {
var url;
function preload(v){
if(v.preload){
if(url = v.templateUrl){
$http.get(url, { cache: $templateCache });
}
}
// state has multiple views. See if they need to be preloaded.
if(v.views){
for(var i in v.views){
// I have seen views with a views property.
// Not sure if it's standard but won't hurt to support them
preload(v.views[i]);
}
}
}
$state.get().forEach(preload);
}])