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 :
Aby uzyskać najlepszy wynik, skrypt angular.js musi zostać załadowany w sekcji head pliku HTML; alternatywnie reguła css (powyżej) musi być zawarta w zewnętrznym arkuszu stylów aplikacji.
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:
<ul ng-show="foo != null" ng-cloak>..</ul>
Dodaj dodatkową regułę ng-show do swojego elementu:
<ul ng-show="isPageFullyLoaded && (foo != null)" ng-cloak>..</ul>
(Musisz zachować, ng-cloak
aby uniknąć problemu 1).
Następnie w zestawie aplikacji. Uruchom isPageFullyLoaded
:
app.run(['$rootScope', function ($rootScope) {
$rootScope.$safeApply = function (fn) {
$rootScope.isPageFullyLoaded = true;
}
}]);
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ę, że isPageFullyLoaded
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ż.
Ważna uwaga: pamiętaj, aby zastosować rozwiązania na obu płaszczach ng nakładanych zbyt późno ORAZ usunąć je wkrótce. Rozwiązanie tylko jednego z tych problemów może nie złagodzić objawów.