Ich habe ein Problem in angle.js mit Direktive / Klasse ng-cloak
oder ng-show
.
Chrome funktioniert einwandfrei, aber Firefox verursacht ein Blinken der Elemente mit ng-cloak
oder ng-show
. IMHO wird es durch das Konvertieren ng-cloak
/ ng-show
zu verursacht style="display: none;"
, wahrscheinlich ist der Firefox-Javascript-Compiler etwas langsamer, also erscheinen die Elemente für eine Weile und verstecken sich dann?
Beispiel:
<ul ng-show="foo != null" ng-cloak>..</ul>
javascript
class
angularjs
MelkorNemesis
quelle
quelle
Antworten:
Obwohl die Dokumentation dies nicht erwähnt, reicht es möglicherweise nicht aus, die
display: none;
Regel zu Ihrem CSS hinzuzufügen . In Fällen, in denen Sie angle.js in den Body laden oder Vorlagen nicht früh genug kompiliert werden, verwenden Sie dieng-cloak
Direktive und fügen Sie Folgendes in Ihr CSS ein:Wie im Kommentar erwähnt,
!important
ist das wichtig. Zum Beispiel, wenn Sie das folgende Markup habenund Sie verwenden gerade
bootstrap.css
, der folgende Selektor ist spezifischer für Ihrng-cloak
ed-ElementWenn Sie also einfach eine Regel einfügen
display: none;
, hat die Bootstrap-Regel Vorrang unddisplay
wird auf festgelegtblock
, sodass das Flimmern angezeigt wird, bevor die Vorlage kompiliert wird.quelle
:
Inng:cloak
nicht ordnungsgemäß entkommen ist. Stellen Sie für reines CSS sicher, dass der Backslash vorhanden ist. Für kompilierte CSS, z. B. Stylus, ist dies der Fall[ng\\:cloak]
. Überprüfen Sie Ihr kompiliertes CSS, um sicherzustellen, dass es korrekt ist.Wie in der Dokumentation erwähnt , sollten Sie Ihrem CSS eine Regel hinzufügen, um sie basierend auf dem
ng-cloak
Attribut auszublenden :Wir verwenden ähnliche Tricks auf der Website "Built with Angular", deren Quelle Sie auf Github anzeigen können: https://github.com/angular/builtwith.angularjs.org
Hoffentlich hilft das!
quelle
Stellen Sie sicher, dass AngularJS im
head
HTML enthalten ist. Siehe ngCloak doc :quelle
ng-cloak
arbeitet jetzt.head
schließt das Problem jedoch nicht.Ich hatte noch nie viel Glück mit ngCloak. Trotz allem, was oben erwähnt wurde, flackere ich immer noch. Die einzige todsichere Möglichkeit, ein Umblättern zu vermeiden, besteht darin, Ihren Inhalt in eine Vorlage einzufügen und die Vorlage einzuschließen. In einem SPA ist der einzige HTML-Code, der vor dem Kompilieren durch Angular ausgewertet wird, Ihre Hauptseite index.html.
Nehmen Sie einfach alles in den Körper und stecken Sie es in eine separate Datei und dann:
Auf diese Weise sollte niemals ein Flackern auftreten, da Angular die Vorlage kompiliert, bevor sie dem DOM hinzugefügt wird.
quelle
ng-include
eine zusätzliche AJAX-Anforderung zum Abrufen des Inhalts vom Server ausgelöst wird. Ich habe auf die harte Tour gelernt, die man zum Beispiel niemalsng-include
drinnen benutzen sollteng-repeat
.ng-app
außerhalb des Markups zu haltenng-include
.ngBind und ngBindTemplate sind Alternativen, für die kein CSS erforderlich ist:
quelle
ng-bind
Dies ist eine gute Möglichkeit, um den "Curly Brace Flash" zu vermeiden oderng-cloak
auf Tag-Ebene zu verwenden, obwohl einige Leute der Meinung sind, dass der Code dadurch weniger lesbar wird. Für sie sehe ich keinen Grund, die beiden Ansätze nicht zu vermischen.Zusätzlich zur akzeptierten Antwort, wenn Sie eine alternative Methode zum Auslösen von ng-cloak verwenden ...
Möglicherweise möchten Sie Ihrem CSS / LESS auch einige zusätzliche Besonderheiten hinzufügen:
quelle
Ich hatte ein ähnliches Problem und fand heraus, dass das Element blinkt, wenn Sie eine Klasse haben, die Übergänge enthält. Ich habe erfolglos versucht, ng-cloak hinzuzufügen, aber durch Entfernen des Übergangs hörte die Schaltfläche auf zu blinken.
Ich verwende ein ionisches Framework und der Button-Outline hat diesen Übergang
Überschreiben Sie einfach die Klasse, um den Übergang zu entfernen, und die Schaltfläche hört auf zu blinken.
Aktualisieren
Auch bei ionic tritt bei Verwendung von ng-show / ng-hide ein Flimmern auf. Durch Hinzufügen des folgenden CSS wird das Problem behoben:
Quelle: http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9
quelle
.button-clear, .button-icon, .button-outline { @include transition(opacity 0s); }
zu meinem scss hinzugefügt .Ich hatte ein Problem, bei dem a
<div ng-show="expression">
zunächst für den Bruchteil einer Sekunde sichtbar war, obwohl "Ausdruck" anfangs falsch war, bevor die ng-show-Direktive ausgeführt werden konnte.Die Lösung, die ich verwendete, bestand darin, die Klasse "ng-hide" wie in manuell hinzuzufügen
<div ng-show="expression" ng-hide>
, um sicherzustellen, dass sie anfänglich ausgeblendet gestartet wurde. Die ng-show-Direktive fügt danach die ng-hide-Klasse nach Bedarf hinzu / entfernt sie.quelle
Versuchen Sie, den Firebug auszuschalten . Es ist mein ernst. Das hilft in meinem Fall.
Wenden Sie akzeptierte Antwort und dann stellen Sie sicher , dass Firebug in Firefox aktiviert ist ausgeschaltet : Drücken Sie F12 dann deaktivieren Firebug für diese Seite - kleine Schaltfläche in der oberen rechten Ecke.
quelle
Es gibt tatsächlich zwei separate Probleme, die das Flimmerproblem verursachen können, und Sie könnten entweder mit einem oder beiden konfrontiert sein.
Problem 1: ng-cloak wird zu spät angelegt
Dieses Problem wurde behoben, da in vielen Antworten auf dieser Seite beschrieben wird, ob AngularJS in den Kopf geladen ist. Siehe ngCloak doc :
Problem 2: ng-Umhang wird zu früh entfernt
Dieses Problem tritt am wahrscheinlichsten auf, wenn auf Ihrer Seite viel CSS mit übereinander kaskadierenden Regeln vorhanden ist und die tieferen CSS-Ebenen aufblitzen, bevor die oberste Ebene angewendet wird.
Die jQuery-Lösungen in Antworten, die das Hinzufügen
style="display:none"
zu Ihrem Element beinhalten, lösen dieses Problem, solange der Stil spät genug entfernt wird (tatsächlich lösen diese Lösungen beide Probleme). Wenn Sie jedoch keine Stile direkt zu Ihrem HTML-Code hinzufügen möchten, können Sie mit die gleichen Ergebnisse erzielenng-show
.Beginnend mit dem Beispiel aus der Frage:
Fügen Sie Ihrem Element eine zusätzliche ng-show-Regel hinzu:
(Sie müssen behalten
ng-cloak
, um Problem 1 zu vermeiden).Dann in Ihrem app.run Set
isPageFullyLoaded
:Beachten Sie, dass app.run je nach dem, was Sie gerade tun, möglicherweise der beste Ort zum Einstellen ist oder nicht
isPageFullyLoaded
. Das Wichtigste ist, sicherzustellen, dass der WertisPageFullyLoaded
auf true gesetzt wird, nachdem alles, was Sie nicht flackern möchten, dem Benutzer angezeigt werden kann.Es hört sich so an, als ob Problem 1 das Problem ist, auf das das OP trifft, aber andere stellen fest, dass die Lösung nicht oder nur teilweise funktioniert, weil sie stattdessen oder auch Problem 2 treffen .
quelle
Wir sind in unserem Unternehmen auf dieses Problem gestoßen und haben es gelöst, indem wir dem CSS-Styling für die flackernden ng-show-Elemente "display: none" hinzugefügt haben. Wir mussten überhaupt keinen Ng-Umhang tragen. Im Gegensatz zu anderen in diesem Thread ist dieses Problem in Safari aufgetreten, jedoch nicht in Firefox oder Chrome - möglicherweise aufgrund des faulen Repaint-Fehlers von Safari in iOS7 .
quelle
Für das, was es wert ist, hatte ich ein ähnliches Problem, dass der Umhang nicht funktionierte. Es kann sich lohnen, Ihre App / Site mit aktiviertem Cache zu überprüfen, um Quelldateien wiederzuverwenden und festzustellen, ob dies hilfreich ist.
Mit meinem flackernden Run-In habe ich mit geöffneten DevTools und deaktiviertem Cache getestet. Das Problem wurde behoben, indem das Panel mit aktiviertem Caching geschlossen blieb.
quelle
Das Problem wurde behoben, indem die folgenden Anweisungen im Head-Tag beibehalten wurden
offizielle Dokumentation
quelle
Ich konnte keine dieser Methoden zum Laufen bringen, also habe ich schließlich Folgendes getan. Für das Element, das Sie zunächst ausblenden möchten:
Fügen Sie dann in Ihrem Controller Folgendes oben oder unten hinzu:
Auf diese Weise wird das Element zunächst ausgeblendet und nur angezeigt, wenn der Controller-Code tatsächlich ausgeführt wurde.
Sie können die Platzierung an Ihre Bedürfnisse anpassen und möglicherweise eine Logik hinzufügen. In meinem Fall wechsle ich zu einem Anmeldepfad, wenn ich noch nicht angemeldet bin, und wollte nicht, dass meine Benutzeroberfläche vorher flackert. Deshalb habe ich
$scope.style
nach der Anmeldeprüfung festgelegt .quelle
Es ist besser zu verwenden
ng-if
alsng-show
.ng-if
Entfernt und erstellt das Element im DOM vollständig neu und verhindert, dass ng-Shows blinken.quelle
Ich verwende ein ionisches Framework. Das Hinzufügen eines CSS-Stils funktioniert unter bestimmten Umständen möglicherweise nicht. Sie können versuchen, ng-if anstelle von ng-show / ng-hide zu verwenden
Ref: https://books.google.com.my/books?id=-_5_CwAAQBAJ&pg=PA138&lpg=PA138&dq=ng-show+hide+flickering+in+ios&source=bl&ots=m2Turk8DFh&sig=8hNiWx26euGR2k_v= = onepage & q = ng-show% 20hide% 20flickering% 20in% 20ios & f = false
quelle
Sie sollten besser auf ein eckiges Dokument verweisen, da die Version [1.4.9] unten aktualisiert wurde, sodass sie die Direktive data-ng-cloak unterstützen kann.
quelle
Ich habe die oben genannte ng-cloak-Lösung ausprobiert, aber es gibt immer noch zeitweise Probleme mit Firefox. Die einzige Problemumgehung, die bei mir funktioniert hat, besteht darin, das Laden des Formulars zu verzögern, bis Angular vollständig geladen ist.
Ich habe einfach ng-init in die App eingefügt und ng-if auf der Formularseite verwendet, um zu überprüfen, ob die von mir festgelegte Variable bereits geladen ist.
quelle
Wenn Sie neben anderen Antworten feststellen, dass der Flash-Code des Vorlagencodes immer noch auftritt, haben Sie wahrscheinlich Ihre Skripte am Ende der Seite, was bedeutet, dass die Direktive ng-cloak direkt nicht funktioniert. Sie können Ihre Skripte entweder in den Kopf verschieben oder eine CSS-Regel erstellen.
In den Dokumenten heißt es: "Um das beste Ergebnis zu erzielen, muss das Skript angle.js im Kopfbereich des HTML-Dokuments geladen werden. Alternativ muss die obige CSS-Regel im externen Stylesheet der Anwendung enthalten sein."
Jetzt muss es kein externes Stylesheet sein, sondern nur ein Element im Kopf.
Quelle: https://docs.angularjs.org/api/ng/directive/ngCloak
quelle
Ich habe jede hier veröffentlichte Lösung ausprobiert und bin in Firefox immer noch flackernd geworden.
Wenn es jemandem hilft, habe ich es gelöst, indem ich es
style="display: none;"
zum Hauptinhaltsbereich hinzugefügt und dann jQuery verwendet habe (ich habe es bereits auf der Seite verwendet),$('#main-div-id').show();
nachdem alles geladen wurde, nachdem Daten vom Server abgerufen wurden .quelle
Ich habe tatsächlich festgestellt, dass der Vorschlag aus Rick Strahls Weblog mein Problem perfekt behoben hat (da ich immer noch das seltsame Problem hatte, dass ng-cloak manchmal roh {{code}} blinkt, insbesondere während Firebug ausgeführt wird):
Die nukleare Option: Den Inhalt manuell ausblenden
Die Verwendung des expliziten CSS ist die beste Wahl, daher sollte Folgendes niemals erforderlich sein. Aber ich werde es hier erwähnen, da es einen Einblick gibt, wie Sie Inhalte beim Laden für andere Frameworks oder in Ihren eigenen Markup-basierten Vorlagen manuell ausblenden / anzeigen können.
Bevor ich herausfand, dass ich den CSS-Stil explizit in die Seite einbetten konnte, hatte ich versucht herauszufinden, warum ng-cloak seinen Job nicht machte. Nachdem ich eine Stunde damit verbracht hatte, nirgendwohin zu gelangen, beschloss ich schließlich, den Container einfach manuell zu verstecken und zu zeigen. Die Idee ist einfach: Blenden Sie den Container zunächst aus und zeigen Sie ihn dann an, sobald Angular die erste Verarbeitung durchgeführt und das Vorlagen-Markup von der Seite entfernt hat.
Sie können den Inhalt manuell ausblenden und sichtbar machen, nachdem Angular die Kontrolle erhalten hat. Dazu habe ich verwendet:
Beachten Sie die Anzeige: Kein Stil, der das Element anfangs auf der Seite explizit verbirgt.
Sobald Angular seine Initialisierung ausgeführt und das Vorlagen-Markup auf der Seite effektiv verarbeitet hat, können Sie den Inhalt anzeigen. Für Angular ist dieses 'ready'-Ereignis die Funktion app.run ():
Dadurch wird die Anzeige effektiv entfernt: kein Stil und der Inhalt wird angezeigt. Zum Zeitpunkt des Auslösens von app.run () ist das DOM bereit, mit gefüllten oder zumindest leeren Daten angezeigt zu werden - Angular hat die Kontrolle erhalten.
quelle
Ich habe alle oben genannten Antworten ausprobiert und nichts hat funktioniert. Verwenden Sie ionic, um eine Hybrid-App zu entwickeln, und versuchen Sie, eine Fehlermeldung nicht flackern zu lassen. Am Ende löste ich mein Problem, indem ich meinem Element eine ng-hide-Klasse hinzufügte. Mein div hat bereits ng-show, um das Element anzuzeigen, wenn ein Fehler auftritt. Durch Hinzufügen von ng-hide wird das div so eingestellt, dass es nicht angezeigt wird, bevor der Winkel geladen wird. Kein ng-Umhang oder Winkel am Kopf erforderlich.
quelle
AS aus der obigen Diskussion
ist der perfekte Weg, um das Problem zu lösen.
quelle
Ich verwende ng-show in einer Direktive, um Popups anzuzeigen und auszublenden.
Keiner der oben genannten Punkte hat für mich funktioniert, und die Verwendung von ng-if anstelle von ng-show wäre ein Overkill. Dies würde bedeuten, dass bei jedem einzelnen Klick der gesamte Popup-Inhalt entfernt und zum DOM hinzugefügt wird. Stattdessen habe ich ein ng-if in dasselbe Element eingefügt, um sicherzustellen, dass es beim Laden des Dokuments nicht angezeigt wird:
Danach habe ich die Initialisierung mit einer Zeitüberschreitung in den für diese Direktive verantwortlichen Controller eingefügt:
Auf diese Weise habe ich das flackernde Problem beseitigt und den kostspieligen Vorgang des Einfügens von DOM bei jedem einzelnen Klick vermieden. Dies ging zu Lasten der Verwendung von zwei Bereichsvariablen für denselben Zweck anstelle von einer, aber bisher ist dies definitiv die beste Option.
quelle
Versucht,
ng-cloak
aber immer noch kurz zu blinken. Unter Code befreien sie vollständig.quelle
Keine der oben aufgeführten Lösungen hat bei mir funktioniert. Ich entschied mich dann, die eigentliche Funktion zu betrachten und stellte fest, dass beim Auslösen von „$ scope.watch“ ein Wert in das Namensfeld eingefügt wurde, was nicht der Fall sein sollte. Also habe ich im Code dann oldValue und newValue gesetzt
Wenn in diesem Fall scope.watch ausgelöst wird, überwacht AngularJS im Wesentlichen die Änderungen an der Namensvariablen (model.value).
quelle
Ich würde das
<ul>
mit einem einwickeln<div ng-cloak>
quelle
<ul>
.ng-cloak
verschleiert das Element, auf das es angewendet wird, sowie die Nachkommen dieses Elements.Ich persönlich habe mich entschieden, das
ng-class
Attribut anstelle des zu verwendenng-show
. Ich habe viel mehr Erfolg auf diesem Weg gehabt, insbesondere bei Popup-Fenstern, die standardmäßig immer nicht angezeigt werden.Was früher war
<div class="options-modal" ng-show="showOptions"></div>
ist jetzt:
<div class="options-modal" ng-class="{'show': isPrintModalShown}">
Das CSS für die Options-Modal-Klasse ist
display: none
standardmäßig aktiviert. Die Showklasse enthält dasdisplay:block
CSS.quelle
Zeilenumbruch vermeiden
Funktioniert mit Firefox 45.0.1
quelle