Quelle est la manière correcte / acceptée d'utiliser des feuilles de style distinctes pour les différentes vues utilisées par mon application?
Actuellement, je place un élément de lien dans le html de view / partial en haut, mais on m'a dit que c'est une mauvaise pratique même si tous les navigateurs modernes le supportent, mais je peux voir pourquoi c'est mal vu.
L'autre possibilité est de placer les feuilles de style séparées dans mon index.html head
mais je voudrais qu'il ne charge la feuille de style que si sa vue est chargée au nom de la performance.
Est-ce une mauvaise pratique puisque le style ne prendra effet qu'après le chargement du CSS depuis le serveur, ce qui entraîne un flash rapide du contenu non formaté dans un navigateur lent? Je n'ai pas encore été témoin de cela bien que je le teste localement.
Existe-t-il un moyen de charger le CSS via l'objet passé à Angular $routeProvider.when
?
Merci d'avance!
la source
<link>
balises css dans ce format , avec le dernier Chrome, le serveur sur ma machine locale (et "Désactiver le cache" pour simuler les conditions de "premier chargement"). J'imagine que pré-insérer une<style>
balise dans le partiel html sur le serveur éviterait ce problème.Réponses:
Je sais que cette question est ancienne maintenant, mais après avoir fait une tonne de recherches sur diverses solutions à ce problème, je pense que j'ai peut-être trouvé une meilleure solution.
Au cas où quelqu'un dans le futur serait intéressé, voici ce que j'ai proposé:
1. Créez une directive personnalisée pour l'
<head>
élément:Cette directive fait les choses suivantes:
$compile
) une chaîne html qui crée un ensemble de<link />
balises pour chaque élément de l'scope.routeStyles
objet en utilisantng-repeat
etng-href
.<link />
éléments compilés à la<head>
balise.$rootScope
pour écouter les'$routeChangeStart'
événements. Pour chaque'$routeChangeStart'
événement, il saisit l'$$route
objet "courant" (la route que l'utilisateur est sur le point de quitter) et supprime son ou ses fichiers css spécifiques partiels de la<head>
balise. Il saisit également l'$$route
objet "suivant" (la route vers laquelle l'utilisateur est sur le point de se rendre) et ajoute l'un de ses fichiers css partiellement spécifiques à la<head>
balise.ng-repeat
partie de la<link />
balise compilée gère tous les ajouts et suppressions de feuilles de style spécifiques à la page en fonction de ce qui est ajouté ou supprimé de l'scope.routeStyles
objet.Remarque: cela nécessite que votre
ng-app
attribut soit sur l'<html>
élément, pas sur<body>
ou quoi que ce soit à l'intérieur de<html>
.2. Spécifiez quelles feuilles de style appartiennent à quels itinéraires à l'aide de
$routeProvider
:Cette configuration ajoute une
css
propriété personnalisée à l'objet utilisé pour configurer l'itinéraire de chaque page. Cet objet est transmis à chaque'$routeChangeStart'
événement en tant que.$$route
. Ainsi, lors de l'écoute de l''$routeChangeStart'
événement, nous pouvons récupérer lacss
propriété que nous avons spécifiée et ajouter / supprimer ces<link />
balises si nécessaire. Notez que la spécification d'unecss
propriété sur l'itinéraire est complètement facultative, car elle a été omise de l''/some/route/2'
exemple. Si la route n'a pas decss
propriété, la<head>
directive ne fera simplement rien pour cette route. Notez également que vous pouvez même avoir plusieurs feuilles de style spécifiques à une page par itinéraire, comme dans l''/some/route/3'
exemple ci-dessus, où lacss
propriété est un tableau de chemins relatifs vers les feuilles de style nécessaires pour cet itinéraire.3. Vous avez terminé. Ces deux choses configurent tout ce qui était nécessaire et il le fait, à mon avis, avec le code le plus propre possible.
J'espère que cela aidera quelqu'un d'autre qui pourrait être aux prises avec ce problème autant que moi.
la source
index.html
fichier. Donc, dans l'exemple ci-dessus,index.html
serait à la racine et lecss
dossier serait à la racine, contenant tous les fichiers css. mais vous pouvez structurer votre application comme vous le souhaitez, à condition d'utiliser les bons chemins relatifs.angular.forEach(current.$$route.css, function(sheet){ delete scope.routeStyles[sheet]; });
.La solution de @ tennisgent est excellente. Cependant, je pense que c'est un peu limité.
La modularité et l'encapsulation dans Angular vont au-delà des routes. Compte tenu de la façon dont le Web évolue vers le développement basé sur les composants, il est important de l'appliquer également dans les directives.
Comme vous le savez déjà, dans Angular, nous pouvons inclure des modèles (structure) et des contrôleurs (comportement) dans les pages et les composants. AngularCSS active la dernière pièce manquante: attacher des feuilles de style (présentation).
Pour une solution complète, je suggère d'utiliser AngularCSS.
ng-app
dans la<html>
balise. Ceci est important lorsque plusieurs applications s'exécutent sur la même pagehttps://github.com/door3/angular-css
Voici quelques exemples:
Itinéraires
Directives
De plus, vous pouvez utiliser le
$css
service pour les cas extrêmes:Vous pouvez en savoir plus sur AngularCSS ici:
http://door3.com/insights/introducing-angularcss-css-demand-angularjs
la source
Pourrait ajouter une nouvelle feuille de style à l'intérieur
$routeProvider
. Pour plus de simplicité, j'utilise une chaîne mais je pourrais également créer un nouvel élément de lien ou créer un service pour les feuilles de styleLe plus grand avantage du pré-codage dans la page est que toutes les images d'arrière-plan existent déjà, et moins
FOUC
la source
<link>
dans<head>
le fichier index.html de manière statique?when
pour l'itinéraire n'a pas été appelé. Peut mettre ce code dans lecontroller
rappel de l'when
intérieur durouteProvider
ou peut - être dans leresolve
rappel qui déclenche probablement plus tôtrouteprovider
... ce commentaire@ sz3, assez drôle aujourd'hui, je devais faire exactement ce que vous essayiez d'accomplir: " charger un fichier CSS spécifique uniquement lorsqu'un utilisateur accède " à une page spécifique. J'ai donc utilisé la solution ci-dessus.
Mais je suis ici pour répondre à votre dernière question: « où dois-je mettre exactement le code. Des idées ?
Vous aviez raison d'inclure le code dans la résolution , mais vous devez changer un peu le format.
Jetez un œil au code ci-dessous:
Je viens de tester et cela fonctionne bien , il injecte le html et il charge mon 'home.css' uniquement lorsque je frappe la route '/ home'.
Une explication complète peut être trouvée ici , mais fondamentalement résoudre: devrait obtenir un objet au format
Vous pouvez nommer la « clé » comme vous le souhaitez - dans mon cas, j'ai appelé « style ».
Ensuite, pour la valeur, vous avez deux options:
S'il s'agit d'une chaîne , il s'agit d'un alias pour un service.
Si c'est une fonction , alors elle est injectée et la valeur de retour est traitée comme la dépendance.
Le point principal ici est que le code à l'intérieur de la fonction va être exécuté avant que le contrôleur ne soit instancié et que l'événement $ routeChangeSuccess soit déclenché.
J'espère que cela pourra aider.
la source
Super merci!! Juste eu à faire quelques ajustements pour le faire fonctionner avec ui-router:
la source
Si vous avez seulement besoin que votre CSS soit appliqué à une vue spécifique, j'utilise cet extrait de code pratique dans mon contrôleur:
Cela ajoutera une classe à ma
body
balise lorsque l'état se charge, et la supprimera lorsque l'état est détruit (c'est-à-dire que quelqu'un change de page). Cela résout mon problème connexe consistant à ne nécessiter que l'application de CSS à un état de mon application.la source
'use strict'; angular.module ('app') .run (['$ rootScope', '$ state', '$ stateParams', function ($ rootScope, $ state, $ stateParams) {$ rootScope. $ state = $ state; $ rootScope . $ stateParams = $ stateParams;}]) .config (['$ stateProvider', '$ urlRouterProvider', function ($ stateProvider, $ urlRouterProvider) {
la source