Zapobiegaj wyświetlaniu notacji nawiasów klamrowych na chwilę przed kompilacją / interpolacją dokumentu przez angular.js


298

Wydaje się, że jest to przede wszystkim problem w IE, gdy do załadowania jest wiele obrazów / skryptów, może być sporo czasu, w którym {{stringExpression}}wyświetlane są literały w znacznikach, a następnie znikają, gdy skończy się kompilacja / interpolacja dokument.

Czy istnieje wspólny powód, dla którego tak się dzieje, który wskazywałby, że robię coś ogólnie źle, lub czy istnieje znany sposób, aby temu zapobiec?



Powyższe było właściwym rozwiązaniem
Edmund Rojas

Odpowiedzi:


283

Myślę, że szukasz ngCloakdyrektywy: https://docs.angularjs.org/api/ng/directive/ngCloak

Z dokumentacji:

Dyrektywa ngCloak służy do zapobiegania wyświetlaniu szablonu Angular HTML w przeglądarce w postaci nieprzetworzonej (nieskompilowanej) podczas ładowania aplikacji. Użyj tej dyrektywy, aby uniknąć niepożądanego efektu migotania spowodowanego wyświetlaniem szablonu HTML.

Dyrektywę można zastosować do <body>elementu, ale preferowanym zastosowaniem jest zastosowanie wielu ngCloak dyrektyw do małych części strony, aby umożliwić stopniowe renderowanie widoku przeglądarki


1
Czy w celu uniknięcia surowego kodu Angular HTML ngCloakpowszechne są najlepsze praktyki? Wydaje się to oczywiste, ale nie mam doświadczenia w AngularJS.
Kevin Meredith,

32
Nie sądzę, że to zadziała, jeśli załadujesz wszystkie skrypty na końcu ciała.
trusktr

8
O tak, czekaj, nvm, odpowiedź LOAS jest rozwiązaniem, jeśli ładujesz skrypty jako ostatnie. Użyj klasy .ng-cloak.
trusktr

3
Załaduj skrypt angularjs w <head>sekcji swojego HTML, ngCloakaby był skuteczny.
Mustafa

1
Mogę potwierdzić, że działa idealnie, jeśli załaduję angular.jsw <head>sekcji mojej strony.
Aron Lorincz

197

Możesz także użyć <span ng-bind="hello"></span>zamiast {{hello}}.

http://jsfiddle.net/4LhN9/34/


94
Jedną z funkcji ng-bind, która jest czasami pomijana, jest to, że możesz określić tekst do wyświetlenia podczas ładowania Angulara: <span ng-bind = "myScopeProperty"> ładowanie ... </span>. Pojawi się komunikat „ładowanie ...”, a następnie zostanie zastąpiony po zdefiniowaniu myScopeProperty.
Mark Rajcok

@MarkRajcok: dzięki za wskazówkę! Nie mam pojęcia. To bardzo proste i eleganckie i rozwiązuje problem, który sam miałem.
Jim Raden

9
Jeśli potrzebujesz wielu wyrażeń, użyj ngBindTemplate. Np. <Span ng-bind-template = "{{scopeProperty1}} {{scopeProperty2}}"> ładowanie ... </span>
Mark Rajcok

27
Możesz także zrobić {{hello || „ładowanie ...”}}
Andrew Joslin

5
@AndyJoslin Nice. Przy takim podejściu kątowy skrypt js musi znajdować się w głowie, a nie na dole strony, aby uniknąć migania wyrażenia {{}} podczas ładowania strony.
s_t_e_v_e

51

Aby poprawić skuteczność podejścia class = 'ng-cloak', gdy skrypty są ładowane na końcu, upewnij się, że w nagłówku dokumentu załadowano następujący css:

.ng-cloak { display:none; }

4
Dodanie! Ważne też nie jest złym pomysłem.
eomeroff

12
Nie visibility: hiddenbyłoby lepiej?
mpen

2
@eomeroff, ale !importantczy hack CSS (zła rzecz) promuje styl do wyboru, prawda? Łamie zasady wyboru CSS.
Kevin Meredith,

5
IMHO to jeden z przypadków!
lex82

3
@ Mark Domyślam się, że „widoczność: ukryty” nadal renderowałoby przestrzeń potrzebną na znaczniki szablonu, podczas gdy „display: none” w ogóle nic nie renderuje. Gdy ukryta jest tylko widoczność, wszelkie elementy zewnętrzne mogą nagle spaść do prawdziwego rozmiaru wewnętrznego, zamiast rosnąć do zera z niczego. Przypuszczam, że to cokolwiek preferuje. :)
James Wilkins

40

Po prostu dodaj maskowanie CSS do nagłówka strony lub jednego z plików CSS:

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

Następnie możesz użyć dyrektywy ngCloak zgodnie z normalną praktyką Angular, i zadziała ona nawet przed załadowaniem samego Angulara .

Właśnie to robi Angular: kod na końcu angular.js dodaje powyższe reguły CSS do nagłówka strony.


+1 Sam wymyśliłem [ngcloak]selektor, ale jest to bardziej kompletne.
Pierre Henry

1
Świetna odpowiedź! Ładuję Angulara na końcu mojego ciała, więc ngCloak jest niedostępny i nadal miga {{}}. To naprawiło to.
Scottie

21

W swoim css dodaj następujące śledzenie

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

A potem w swoim kodzie możesz dodać dyrektywę ng-cloak. Na przykład,

<div ng-cloak>
   Welcome {{data.name}}
</div>

Otóż ​​to!



3

Zgadzam się z odpowiedzią @ pkozlowski.opensource, ale klasa ng-clock nie działała dla mnie w przypadku używania z ng-repeat. dlatego chciałbym polecić użycie klasy dla prostego wyrażenia separatora, takiego jak {{name}} i dyrektywy ngCloak dla ng-repeat.

<div class="ng-cloak">{{name}}<div>

i

<li ng-repeat="item in items" ng-cloak>{{item.name}}<li>

Dzięki, że zauważyłeś błąd
Jaison
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.