Mam problem w angular.js z dyrektywą / klasą ng-cloak
lub ng-show
.
Chrome działa dobrze, ale Firefox powoduje miganie elementów za pomocą ng-cloak
lub ng-show
. IMHO jest spowodowany przez konwersję ng-cloak
/ ng-show
do style="display: none;"
, prawdopodobnie kompilator javascript w Firefoksie jest nieco wolniejszy, więc elementy pojawiają się przez chwilę, a następnie się chowają?
Przykład:
<ul ng-show="foo != null" ng-cloak>..</ul>
javascript
class
angularjs
MelkorNemesis
źródło
źródło
Odpowiedzi:
Chociaż dokumentacja nie wspomina o tym, dodanie
display: none;
reguły do CSS może być niewystarczające . W przypadku, gdy ładujesz plik angular.js w treści lub szablony nie są wystarczająco szybko skompilowane, skorzystaj zng-cloak
dyrektywy i dołącz do CSS:Jak wspomniano w komentarzu,
!important
jest to ważne. Na przykład, jeśli masz następujące znacznikii akurat używasz
bootstrap.css
, poniższy selektor jest bardziej szczegółowy dla twojegong-cloak
elementu edJeśli więc włączysz regułę po prostu
display: none;
, reguła Bootstrap będzie miała pierwszeństwo idisplay
zostanie ustawiona nablock
, więc zobaczysz migotanie przed kompilacją szablonu.źródło
:
nang:cloak
nie uciekł prawidłowo. Dla czystego CSS upewnij się, że występuje odwrotny ukośnik. Dla skompilowanego css, np. Stylus, będzie[ng\\:cloak]
. Sprawdź skompilowany CSS, aby upewnić się, że jest poprawny.Jak wspomniano w dokumentacji , należy dodać regułę do CSS, aby ukryć ją na podstawie
ng-cloak
atrybutu:Podobne sztuczki wykorzystujemy na stronie „Built with Angular”, której źródło możesz obejrzeć na Github: https://github.com/angular/builtwith.angularjs.org
Mam nadzieję, że to pomaga!
źródło
Upewnij się, że AngularJS znajduje się w kodzie
head
HTML. Zobacz dokument ngCloak :źródło
ng-cloak
teraz pracuje.head
arkusza stylów późniejszych nie rozwiązuje problemu.Nigdy nie miałem dużo szczęścia, używając ngCloak. Nadal migoczę pomimo wszystkiego, co wspomniano powyżej. Jedynym pewnym sposobem na uniknięcie przesuwania jest umieszczenie treści w szablonie i dołączenie szablonu. W SPA jedynym HTMLem, który zostanie oceniony przed kompilacją przez Angular, jest twoja główna strona index.html.
Po prostu weź wszystko do ciała i umieść w osobnym pliku, a następnie:
Nigdy nie powinieneś migotać w ten sposób, ponieważ Angular skompiluje szablon przed dodaniem go do DOM.
źródło
ng-include
spawnuje dodatkowe żądanie AJAX w celu pobrania zawartości z serwera. Nauczyłem się na przykład, że nigdy nie powinieneś używać wng-include
środkung-repeat
.ng-app
pozang-include
znacznikami.ngBind i ngBindTemplate to alternatywy, które nie wymagają CSS:
źródło
ng-bind
to dobry sposób na uniknięcie „flashowania nawiasami klamrowymi” lub konieczności używania gong-cloak
na poziomie tagów, chociaż niektórzy uważają, że sprawia, że kod jest mniej czytelny. Dla nich nie widzę powodu, aby nie mieszać tych dwóch podejść.Oprócz zaakceptowanej odpowiedzi, jeśli używasz alternatywnej metody wyzwalania ng-cloak ...
Możesz również dodać kilka dodatkowych szczegółów do swojego CSS / MNIEJ:
źródło
Miałem podobny problem i odkryłem, że jeśli masz klasę zawierającą przejścia, element będzie migał. Próbowałem dodać ng-cloak bez powodzenia, ale po usunięciu przejścia przycisk przestał migać.
Używam szkieletu jonowego, a kontur przycisku ma to przejście
Wystarczy zastąpić klasę, aby usunąć przejście, a przycisk przestanie migać.
Aktualizacja
Ponownie na jonach pojawia się migotanie podczas używania ng-show / ng-hide. Dodanie następującego CSS rozwiązuje to:
Źródło: http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9
źródło
.button-clear, .button-icon, .button-outline { @include transition(opacity 0s); }
do mojego scss.Miałem problem polegający na tym,
<div ng-show="expression">
że na początku ułamek sekundy byłby widoczny, chociaż „wyrażenie” było początkowo fałszywe, zanim dyrektywa ng-show miała szansę uruchomić.Rozwiązaniem, którego użyłem było ręczne dodanie klasy „ng-hide”, tak jak w
<div ng-show="expression" ng-hide>
, aby upewnić się, że początkowo była ukryta. Dyrektywa ng-show w razie potrzeby doda / usunie klasę ng-hide.źródło
Spróbuj wyłączyć Firebug . Jestem poważny. To pomaga w moim przypadku.
Zastosuj zaakceptowaną odpowiedź, a następnie upewnij się, że Firebug w przeglądarce Firefox jest wyłączony : naciśnij F12, a następnie wyłącz Firebug dla tej strony - mały przycisk w prawym górnym rogu.
źródło
W rzeczywistości istnieją dwa oddzielne problemy, które mogą powodować problem z migotaniem i możesz napotkać jeden lub oba z nich.
Problem 1: Płaszcz ng nakłada się zbyt późno
Ten problem został rozwiązany, jak opisano w wielu odpowiedziach na tej stronie, aby upewnić się, że AngularJS jest załadowany do głowy. Zobacz dokument ngCloak :
Problem 2: Płaszcz ng jest usuwany zbyt wcześnie
Ten problem występuje najprawdopodobniej, gdy na stronie jest dużo CSS z regułami kaskadowymi względem siebie, a głębsze warstwy CSS migają przed nałożeniem górnej warstwy.
Rozwiązania jQuery w odpowiedziach dotyczących dodawania
style="display:none"
do elementu rozwiązują ten problem, o ile styl jest usuwany wystarczająco późno (w rzeczywistości rozwiązania te rozwiązują oba problemy). Jeśli jednak wolisz nie dodawać stylów bezpośrednio do kodu HTML, możesz osiągnąć te same wyniki za pomocąng-show
.Począwszy od przykładu z pytania:
Dodaj dodatkową regułę ng-show do swojego elementu:
(Musisz zachować,
ng-cloak
aby uniknąć problemu 1).Następnie w zestawie aplikacji. Uruchom
isPageFullyLoaded
:Pamiętaj, że w zależności od tego, co robisz, app.run może być najlepszym miejscem do ustawienia
isPageFullyLoaded
. Ważne jest, aby upewnić się, żeisPageFullyLoaded
zostanie ustawiona wartość true, gdy wszystko, czego nie chcesz migotać, jest gotowe do ujawnienia użytkownikowi.Wygląda na to, że Problem 1 jest problemem, na który uderza OP, ale inni stwierdzają, że rozwiązanie nie działa lub tylko częściowo działa, ponieważ zamiast tego trafia na Problem 2 lub też.
źródło
W naszej firmie napotkaliśmy ten problem i rozwiązaliśmy go, dodając „display: none” do stylizacji CSS dla tych migających elementów ng-show. W ogóle nie musieliśmy używać peleryny. W przeciwieństwie do innych w tym wątku ten problem występował w przeglądarce Safari, ale nie w przeglądarce Firefox ani Chrome - prawdopodobnie z powodu leniwego błędu odświeżania przeglądarki Safari w systemie iOS7 .
źródło
Za to, co jest warte, miałem podobny problem z niedziałającym płaszczem ng. Warto sprawdzić swoją aplikację / witrynę z włączoną pamięcią podręczną, aby ponownie wykorzystać pliki źródłowe, aby sprawdzić, czy to pomoże.
Z moim docierania z migotaniem testowałem przy otwartym DevTools i wyłączonej pamięci podręcznej. Pozostawienie panelu zamkniętego z włączonym buforowaniem naprawiło mój problem.
źródło
Utrzymanie poniższych instrukcji w tagu head rozwiązało ten problem
oficjalna dokumentacja
źródło
Nie mogłem zmusić żadnej z tych metod do działania, więc w końcu zrobiłem następujące. W przypadku elementu, który chcesz początkowo ukryć:
Następnie w kontrolerze dodaj to na górze lub w pobliżu:
W ten sposób element jest początkowo ukryty i wyświetla się tylko wtedy, gdy kod kontrolera rzeczywiście się uruchomił.
Możesz dostosować miejsce docelowe do swoich potrzeb, być może dodając trochę logiki. W moim przypadku przełączam się na ścieżkę logowania, jeśli nie jestem zalogowany, i nie chciałem wcześniej migotać interfejsu, więc ustawiłem
$scope.style
po sprawdzeniu zalogowanego.źródło
Lepiej używać
ng-if
zamiastng-show
.ng-if
całkowicie usuwa i odtwarza element w DOM i pomaga uniknąć mrugania na ng-show.źródło
Używam platformy jonowej, dodanie stylu css może nie działać w pewnych okolicznościach, możesz spróbować użyć ng-if zamiast ng-show / ng-hide
ref: https://books.google.com.my/books?id=-_5_CwAAQBAJ&pg=PA138&lpg=PA138&dq=ng-show+hide+hick+flickering+in+ios&source=bl&ots=m2Turk8DFh&sig=8hNiWx26euGRV&&_=&GRK&K = na stronie i q = ng-show% 20hide% 20 migotanie% 20in% 20ios & f = false
źródło
Lepiej odwołaj się do dokumentu kątowego, ponieważ wersja [1.4.9] ma aktualizację poniżej, dzięki czemu może obsługiwać dyrektywę maskowania danych.
źródło
Wypróbowałem powyższe rozwiązanie ng-cloak, ale nadal występują sporadyczne problemy z Firefoksem. Jedynym obejściem, które działało dla mnie, było opóźnienie ładowania formularza do momentu pełnego załadowania Angulara.
Po prostu dodałem ng-init w aplikacji i używam ng-if po stronie formularza, aby sprawdzić, czy ustawiona zmienna jest już załadowana.
źródło
Oprócz innych odpowiedzi, jeśli nadal pojawia się flash kodu szablonu, prawdopodobnie masz skrypty na dole strony, co oznacza, że dyrektywa ng-cloak nie będzie działać. Możesz przenieść skrypty do głowy lub utworzyć regułę CSS.
Dokumenty mówią „Aby uzyskać najlepszy wynik, skrypt angular.js musi zostać załadowany w sekcji head dokumentu HTML; alternatywnie powyższa reguła css musi zostać zawarta w zewnętrznym arkuszu stylów aplikacji”.
Teraz nie musi to być zewnętrzny arkusz stylów, ale tylko element w głowie.
źródło: https://docs.angularjs.org/api/ng/directive/ngCloak
źródło
Wypróbowałem wszystkie zamieszczone tutaj rozwiązania i nadal migotałem w przeglądarce Firefox.
Jeśli komukolwiek to pomaga, rozwiązałem go, dodając
style="display: none;"
do głównego div div treści, a następnie używając jQuery (użyłem go już na stronie),$('#main-div-id').show();
gdy wszystko zostało załadowane po pobraniu danych z serwera;źródło
Właściwie znalazłem sugestię z dziennika sieci Ricka Strahla doskonale rozwiązała mój problem (ponieważ wciąż miałem dziwny problem z czasami mruganiem surowego {{code}} ng-cloak, szczególnie podczas uruchamiania Firebug):
Opcja nuklearna: ręczne ukrywanie treści
Korzystanie z jawnego CSS jest najlepszym wyborem, więc poniższe nie powinny być nigdy konieczne. Ale wspomnę o tym tutaj, ponieważ daje pewien wgląd w to, jak ręcznie ukrywać / wyświetlać zawartość przy ładowaniu dla innych frameworków lub we własnych szablonach opartych na znacznikach.
Zanim zorientowałem się, że mogę wyraźnie osadzić styl CSS na stronie, próbowałem dowiedzieć się, dlaczego ng-cloak nie spełnia swojej roli. Po marnowaniu godziny na nic nie zdecydowałem w końcu po prostu ręcznie ukryć i pokazać pojemnik. Pomysł jest prosty - początkowo ukryj pojemnik, a następnie pokaż go, gdy Angular dokończy przetwarzania i usunie znaczniki szablonu ze strony.
Możesz ręcznie ukryć zawartość i sprawić, aby była widoczna po przejęciu kontroli przez Angular. Aby to zrobić, użyłem:
Zwróć uwagę na sposób wyświetlania: żaden styl, który początkowo wyraźnie ukrywa element na stronie.
Następnie, gdy Angular uruchomi swoją inicjalizację i efektywnie przetworzy znaczniki szablonów na stronie, możesz wyświetlić zawartość. W przypadku Angular tym „gotowym” zdarzeniem jest funkcja app.run ():
To skutecznie usuwa wyświetlanie: brak stylu i wyświetlanie zawartości. Do czasu uruchomienia app.run () DOM jest gotowy do wyświetlenia z wypełnionymi danymi lub przynajmniej pustymi danymi - Angular przejął kontrolę.
źródło
Próbowałem wszystkich powyższych odpowiedzi i nic nie działało. Używałem jonu do opracowania aplikacji hybrydowej i starałem się, aby komunikat o błędzie nie migał. Rozwiązałem problem, dodając klasę ng-hide do mojego elementu. Mój div ma już ng-show, aby pokazać element, gdy wystąpi błąd. Dodanie ng-hide powoduje, że div nie będzie wyświetlany przed załadowaniem kąta. Nie jest konieczne maskowanie ani powiększanie głowy pod kątem.
źródło
AS z powyższej dyskusji
to idealny sposób na rozwiązanie problemu.
źródło
Używam ng-show w dyrektywie, aby wyświetlać i ukrywać wyskakujące okienka.
Żadne z powyższych nie działało dla mnie, a użycie ng-if zamiast ng-show byłoby przesadą. Oznaczałoby to usunięcie i dodanie całej zawartości wyskakującego okienka do DOM za każdym kliknięciem. Zamiast tego dodałem ng-if do tego samego elementu, aby upewnić się, że nie wyświetla się przy ładowaniu dokumentu:
Następnie dodałem inicjalizację do kontrolera odpowiedzialnego za tę dyrektywę z limitem czasu:
W ten sposób wyeliminowałem problem migotania i uniknąłem kosztownej operacji wstawiania DOM przy każdym kliknięciu. Stało się to kosztem użycia dwóch zmiennych zasięgu w tym samym celu zamiast jednej, ale jak dotąd jest to zdecydowanie najlepsza opcja.
źródło
Próbowałem,
ng-cloak
ale wciąż mruga. Poniższy kod pozbądź się ich całkowicie.źródło
Żadne z wyżej wymienionych rozwiązań nie działało dla mnie. Następnie postanowiłem spojrzeć na faktyczną funkcję i zdałem sobie sprawę, że kiedy uruchomiono „$ scope.watch”, wstawiało wartość w polu nazwy, co nie miało tak być. Więc w kodzie ustawiłem i oldValue i newValue
Zasadniczo, gdy w tym przypadku zostanie uruchomiony zakres.watch, AngularJS monitoruje zmiany w zmiennej nazwy (model.value)
źródło
Chciałbym by owinąć
<ul>
z<div ng-cloak>
źródło
<ul>
.ng-cloak
będzie maskować dowolny element, do którego jest zastosowany, a także potomków tego elementu.Ja osobiście zdecydowałem się użyć
ng-class
atrybutu zamiastng-show
. Odniosłem dużo większy sukces na tej trasie, szczególnie w przypadku okien wyskakujących, które zawsze nie są wyświetlane domyślnie.Co było kiedyś
<div class="options-modal" ng-show="showOptions"></div>
jest teraz:
<div class="options-modal" ng-class="{'show': isPrintModalShown}">
display: none
domyślnie CSS dla klasy modów opcji . Klasa show zawieradisplay:block
CSS.źródło
Unikaj łamania linii
Działa z Firefoksem 45.0.1
źródło