Wie verwende ich die ng-cloak-Direktive richtig?

Lesezeit: 5 Minuten

Kotaros Benutzeravatar
Kotaro

Irgendwie funktioniert ng-cloak in AngularJS nicht. Ich möchte {{ }} beim Laden der Seite ausblenden. Weil es schrecklich aussieht.

<!DOCTYPE html>
<html lang="en" ng-app>
    <head>
        <meta charset="UTF-8">
        <title>Angular Sample</title>
    </head>
    <body ng-model="isShow" ng-init="isShow=true">

        <p ng-show="isShow"><span ng-cloak>{{ isShow }}</span></p>
        <p ng-show="!isShow"><span ng-cloak>{{ isShow }}</span></p>

        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    </body>
</html>

  • Sie haben ng-app keinen Namen gegeben

    – Mohammedias

    30. März 2015 um 5:59 Uhr

  • Wie analysiert das überhaupt die Ausdrücke? Dies ist eine weitere Stelle, an der ng-init falsch verwendet wird; Die Direktive ng-init ist trotz ihres Namens kein Allzweck-Initialisierer.

    – Claies

    31. März 2015 um 11:15 Uhr

  • Wie @AR7 sagte, müssen Sie etwas CSS einfügen, damit es funktioniert. Ich empfehle nicht, angle.js in den Head-Bereich zu stellen.

    – Joao Polo

    31. März 2015 um 15:39 Uhr

Fügen Sie dieses CSS hinzu hier

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}

und verwenden Sie entweder den Klassennamen oder das Attribut in Ihrem übergeordneten div oder an einer anderen Stelle, an der Sie Ihre App definiert haben.

z.B:

<div ng-app="Random" class="ng-cloak">
</div>

  • Ich wünschte, alle Antworten auf SO wären so 🙂

    – devdropper87

    28. Oktober 2015 um 23:26 Uhr

  • Funktioniert perfekt, aber könnten Sie diese CSS bitte näher erläutern? was genau macht es?

    – Cemre Mengu

    21. November 2015 um 13:47 Uhr

  • @Cemre Es fügt die hinzu display: none Eigenschaft für alle Variationen der ng-cloak-Klasse und -Direktive. Diese Klasse ist während der Ladezeit Ihrer App aktiv, daher stellt dieses CSS sicher, dass die Elemente mit dieser Klasse nicht angezeigt werden.

    – Hartger

    26. November 2015 um 9:37 Uhr

  • (aus dem Doc-Link von @GregL), ein wenig mehr über das WARUM: Das Problem mit dem OP-Code besteht darin, dass der Code die angle.min.js am Ende des Seitenladevorgangs lädt, sodass das HTML (Angular-Template) vorher gerendert wird ng-cloak wird definiert. Das Hinzufügen der CSS-Regelreferenz hier funktioniert einfach durch Definieren des eigenen ng-cloak-Stils von angle im , sodass er (bevor Angular.min.js geladen wird) sofort vorhanden ist, wenn die Seite geladen wird, selbst wenn Sie angle erst laden Ende des HTML. Doc empfiehlt das Laden von angle.js in , um dieses Problem zu vermeiden/minimieren.

    – Mike

    4. Januar 2016 um 21:13 Uhr

Aus die Angular-Dokumentation:

Für das beste Ergebnis ist die angular.js Skript muss im Head-Bereich des HTML-Dokuments geladen werden; Alternativ muss die obige CSS-Regel in das externe Stylesheet der Anwendung eingefügt werden.

Diese Regeln müssen Sie in Ihrem CSS angeben:

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}

Benutzeravatar von kenhow
kenhow

Die Verwendung von ngBind sollte das ebenfalls beseitigen (ich entwickle manchmal in SharePoint und ngCloak funktioniert nicht).

AngularJS-Dokumentation:

Es ist vorzuziehen, ngBind anstelle von {{ expression }} zu verwenden, wenn ein Template vorübergehend vom Browser im Rohzustand angezeigt wird, bevor Angular es kompiliert. Da ngBind ein Elementattribut ist, macht es die Bindungen für den Benutzer unsichtbar, während die Seite geladen wird.

Eine alternative Lösung für dieses Problem wäre die Verwendung der ngCloak-Direktive.

JS:

var app = angular.module('test', []);

app.controller('testCtrl', ['$scope', function($scope) {
  $scope.test = "Hello World";
}]);

HTML:

<html ng-app="test">

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
  <script src="script.js"></script>
</head>

<body ng-controller="testCtrl">
  <h1 ng-bind="test"></h1>
</body>

</html>

Fügen Sie unten in Ihre CSS-Datei ein: –

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}

  • Das OP hat dem keinen Namen gesetzt ng-app Richtlinie und mit Winkel 1.3+. Hoffe, das ist es, was verhindert, dass es funktioniert

    – Mohammedias

    30. März 2015 um 6:04 Uhr


  • @mohamedrias mag möglich sein, aber er verwendet keinen ng-controller oder etwas, das mit Modulen zu tun hat, also denke ich, dass es in diesem speziellen Fall kein Problem verursachen wird 🙂

    – Squiroid

    30. März 2015 um 6:12 Uhr

Benutzeravatar von Rolintocour
Rollintocour

In meinem Fall dachte ich, dass meine Probleme auf ausstehende Ajax-Anfragen zurückzuführen waren. Ng-cloak funktioniert wahrscheinlich für statische Inhalte, aber wenn eine Vorlage von Ajax-Daten abhängt, werden diese daher gerendert, bevor die Ajax-Antwort empfangen wird.

Um dies zu vermeiden, definiere ich eine Direktive:

angu

mymodule
        .directive("ajaxCloak", ['$interval', '$http', function ($interval, $http) {
            return {
                restrict: 'A',
                link: function (scope, element, attrs) {
                    let stop = $interval(() => {
                        if ($http.pendingRequests.length === 0) {
                            $interval.cancel(stop);
                            attrs.$set("ajaxCloak", undefined);
                            element.removeClass("ajax-cloak");
                        }
                    }, 100);

                }
            };
        }]);

Mit ein bisschen CSS:

[ajax-cloak], [data-ajax-cloak], [x-ajax-cloak], .ajax-cloak {
  display: none !important;
}

Dann in Ihrer Haupt-HTML-Datei:

<div ui-view data-ajax-cloak></div>

Hinweis: Dies ist nicht so ausgefeilt wie ng-cloak, da dies ein globaler Cloack ist, er verbirgt alles, bis alle Anfragen abgeschlossen sind.

  • Das OP hat dem keinen Namen gesetzt ng-app Richtlinie und mit Winkel 1.3+. Hoffe, das ist es, was verhindert, dass es funktioniert

    – Mohammedias

    30. März 2015 um 6:04 Uhr


  • @mohamedrias mag möglich sein, aber er verwendet keinen ng-controller oder etwas, das mit Modulen zu tun hat, also denke ich, dass es in diesem speziellen Fall kein Problem verursachen wird 🙂

    – Squiroid

    30. März 2015 um 6:12 Uhr

Benutzeravatar von Jens Alenius
Jens Alenius

Meine Lösung Ich glaube, ich habe alle oben genannten Vorschläge ausprobiert, aber nichts hat funktioniert. Einige verwenden ng-include, aber es scheint ein bisschen zu viel zu sein, außerdem könnte es mit dem inneren Bereich, der erstellt wird, beängstigend sein. Also versuchte man es mit style und ng-style. In meiner betroffenen Haupt-Div.

<div class="container" style="display:hidden;" ng-style="loaded">

Dann setze ich die in meinem Basiscontroller geladene Bereichsvariable.

$scope.loaded ={display:'block'};

Ich habe immer noch all diese {{ }}. Seltsam, wenn die Anzeige nur blockiert wird, wenn anglejs geladen wurde. Dann bemerkte ich, dass ich die Firefox f12-Entwicklerkonsole am Laufen hatte. Es macht Sachen. Ich Idiot

1404270cookie-checkWie verwende ich die ng-cloak-Direktive richtig?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy