Was ist die richtige / akzeptierte Methode, um separate Stylesheets für die verschiedenen Ansichten zu verwenden, die meine Anwendung verwendet?
Momentan platziere ich ein Link-Element im HTML-Code der Ansicht / des Teils oben, aber mir wurde gesagt, dass dies eine schlechte Praxis ist, obwohl alle modernen Browser dies unterstützen, aber ich kann sehen, warum es verpönt ist.
Die andere Möglichkeit besteht darin, die separaten Stylesheets in meine index.html zu platzieren. head
Ich möchte jedoch, dass das Stylesheet nur geladen wird, wenn seine Ansicht im Namen der Leistung geladen wird.
Ist dies eine schlechte Vorgehensweise, da das Styling erst nach dem Laden des CSS vom Server wirksam wird und in einem langsamen Browser schnell unformatierte Inhalte blinken? Ich habe dies noch nicht gesehen, obwohl ich es lokal teste.
Gibt es eine Möglichkeit, das CSS über das an Angular übergebene Objekt zu laden $routeProvider.when
?
Danke im Voraus!
quelle
<link>
Tags in diesem Format verwendet , mit dem neuesten Chrome, dem Server auf meinem lokalen Computer (und "Cache deaktivieren", um die Bedingungen für das erste Laden zu simulieren). Ich stelle mir vor, dass das Vorabfügen eines<style>
Tags in den HTML-Teil auf dem Server dieses Problem vermeiden würde.Antworten:
Ich weiß, dass diese Frage jetzt alt ist, aber nachdem ich eine Menge Nachforschungen über verschiedene Lösungen für dieses Problem angestellt habe, denke ich, dass ich vielleicht eine bessere Lösung gefunden habe.
Für den Fall, dass jemand in der Zukunft interessiert ist, habe ich mir Folgendes ausgedacht:
1. Erstellen Sie eine benutzerdefinierte Direktive für das
<head>
Element:Diese Richtlinie bewirkt Folgendes:
$compile
) einer HTML - Zeichenfolge , die eine Reihe von erstellt<link />
Tags für jedes Element in demscope.routeStyles
Objekt verwendetng-repeat
undng-href
.<link />
Elementen wird an das<head>
Tag angehängt .$rootScope
, um auf'$routeChangeStart'
Ereignisse zu warten . Bei jedem'$routeChangeStart'
Ereignis wird das "aktuelle"$$route
Objekt (die Route, die der Benutzer gerade verlassen wird) erfasst und seine partiellspezifische CSS-Datei (en) aus dem<head>
Tag entfernt. Es erfasst auch das "nächste"$$route
Objekt (die Route, zu der der Benutzer gehen wird) und fügt dem<head>
Tag eine seiner teilspezifischen CSS-Dateien hinzu .ng-repeat
Teil des kompilierten<link />
Tags übernimmt das Hinzufügen und Entfernen der seitenspezifischen Stylesheets basierend auf dem, was demscope.routeStyles
Objekt hinzugefügt oder daraus entfernt wird.Hinweis: Dies setzt voraus, dass sich Ihr
ng-app
Attribut auf dem<html>
Element befindet, nicht auf<body>
oder irgendetwas innerhalb von<html>
.2. Geben Sie Folgendes an, welche Stylesheets zu welchen Routen gehören
$routeProvider
:Diese Konfiguration fügt
css
dem Objekt eine benutzerdefinierte Eigenschaft hinzu, mit der die Route jeder Seite eingerichtet wird. Dieses Objekt wird an jedes'$routeChangeStart'
Ereignis als übergeben.$$route
. Wenn'$routeChangeStart'
wir also das Ereignis abhörencss
, können wir die von uns angegebene Eigenschaft abrufen und diese<link />
Tags nach Bedarf anhängen / entfernen . Beachten Sie, dass die Angabe einercss
Eigenschaft auf der Route völlig optional ist, da sie im'/some/route/2'
Beispiel weggelassen wurde . Wenn die Route keinecss
Eigenschaft hat, wird die<head>
Direktive einfach nichts für diese Route tun. Beachten Sie auch, dass Sie sogar mehrere seitenspezifische Stylesheets pro Route haben können, wie im'/some/route/3'
obigen Beispiel, wobei diecss
Eigenschaft ein Array relativer Pfade zu den für diese Route benötigten Stylesheets ist.3. Sie sind fertig Diese beiden Dinge richten alles ein, was benötigt wurde, und meiner Meinung nach mit dem saubersten Code, der möglich ist.
Ich hoffe, das hilft jemand anderem, der mit diesem Problem genauso zu kämpfen hat wie ich.
quelle
index.html
Datei. Im obigen Beispiel befindetindex.html
sich also dercss
Ordner im Stammverzeichnis und der Ordner im Stammverzeichnis, der alle CSS-Dateien enthält. Sie können Ihre App jedoch beliebig strukturieren, sofern Sie die richtigen relativen Pfade verwenden.angular.forEach(current.$$route.css, function(sheet){ delete scope.routeStyles[sheet]; });
.Die Lösung von @ Tennisgent ist großartig. Ich denke jedoch, dass dies etwas eingeschränkt ist.
Modularität und Kapselung in Angular gehen über Routen hinaus. Aufgrund der Art und Weise, wie sich das Web in Richtung komponentenbasierter Entwicklung bewegt, ist es wichtig, dies auch in Richtlinien anzuwenden.
Wie Sie bereits wissen, können wir in Angular Vorlagen (Struktur) und Controller (Verhalten) in Seiten und Komponenten einfügen. AngularCSS aktiviert das letzte fehlende Teil: Anhängen von Stylesheets (Präsentation).
Für eine vollständige Lösung empfehle ich die Verwendung von AngularCSS.
ng-app
im<html>
Tag enthalten sein. Dies ist wichtig, wenn mehrere Apps auf derselben Seite ausgeführt werdenhttps://github.com/door3/angular-css
Hier sind einige Beispiele:
Routen
Richtlinien
Darüber hinaus können Sie den
$css
Dienst für Randfälle verwenden:Weitere Informationen zu AngularCSS finden Sie hier:
http://door3.com/insights/introducing-angularcss-css-demand-angularjs
quelle
Könnte ein neues Stylesheet anhängen, um darin zu gehen
$routeProvider
. Der Einfachheit halber verwende ich eine Zeichenfolge, kann aber auch ein neues Verknüpfungselement erstellen oder einen Dienst für Stylesheets erstellenDer größte Vorteil des Prelaodierens in der Seite besteht darin, dass bereits Hintergrundbilder vorhanden sind und weniger Lügen vorhanden sind
FOUC
quelle
<link>
in<head>
die index.html aufnehmen?when
für die Route nicht aufgerufen wurde. Kann diesen Code in einencontroller
Rückrufwhen
innerhalb desrouteProvider
oder vielleicht innerhalb einesresolve
Rückrufsrouteprovider
... In diesem Kommentar ging es darum, es in den Kopf der Hauptseite aufzunehmen, wenn die Seite@ sz3, lustig genug heute musste ich genau das tun, was du erreichen wolltest: ' eine bestimmte CSS-Datei nur laden, wenn ein Benutzer auf eine bestimmte Seite zugreift '. Also habe ich die obige Lösung verwendet.
Aber ich bin hier, um Ihre letzte Frage zu beantworten: „ Wo genau soll ich den Code einfügen? Irgendwelche Ideen ? '
Sie hatten Recht, den Code in die Auflösung aufzunehmen , aber Sie müssen das Format ein wenig ändern.
Schauen Sie sich den folgenden Code an:
Ich habe gerade getestet und es funktioniert gut , es injiziert das HTML und es lädt meine 'home.css' nur, wenn ich die '/ home'-Route treffe.
Eine vollständige Erklärung finden Sie hier , aber im Grunde genommen lösen: sollte ein Objekt im Format erhalten
Sie können den ' Schlüssel ' beliebig benennen - in meinem Fall habe ich ' Stil ' genannt.
Dann haben Sie für den Wert zwei Möglichkeiten:
Wenn es sich um eine Zeichenfolge handelt , handelt es sich um einen Alias für einen Dienst.
Wenn es funktioniert , wird es injiziert und der Rückgabewert wird als Abhängigkeit behandelt.
Der Hauptpunkt hierbei ist, dass der Code in der Funktion ausgeführt wird, bevor der Controller instanziiert und das Ereignis $ routeChangeSuccess ausgelöst wird.
Hoffentlich hilft das.
quelle
Geil, danke!! Ich musste nur ein paar Anpassungen vornehmen, damit es mit dem UI-Router funktioniert:
quelle
Wenn Ihr CSS nur auf eine bestimmte Ansicht angewendet werden soll , verwende ich dieses praktische Snippet in meinem Controller:
Dadurch wird meinem
body
Tag eine Klasse hinzugefügt, wenn der Status geladen wird, und diese wird entfernt, wenn der Status zerstört wird (dh jemand wechselt die Seiten). Dies löst mein damit verbundenes Problem, dass nur CSS in meiner Anwendung auf einen Status angewendet werden muss.quelle
'use strict'; angle.module ('app') .run (['$ rootScope', '$ state', '$ stateParams', Funktion ($ rootScope, $ state, $ stateParams) {$ rootScope. $ state = $ state; $ rootScope . $ stateParams = $ stateParams;}]) .config (['$ stateProvider', '$ urlRouterProvider', Funktion ($ stateProvider, $ urlRouterProvider) {
quelle