На самом деле есть две отдельные проблемы, которые могут вызвать проблему мерцания, и вы можете столкнуться с одной или обеими из них.
Проблема 1: нг-плащ применяется слишком поздно
Эта проблема решена, как описано во многих ответах на этой странице, чтобы убедиться, что AngularJS загружен в голову. Смотрите документ ngCloak :
Для достижения наилучшего результата скрипт angular.js должен быть загружен в раздел head файла html; альтернативно, правило css (выше) должно быть включено во внешнюю таблицу стилей приложения.
Проблема 2: нг-плащ удаляется слишком рано
Скорее всего, эта проблема возникает, когда у вас на странице много CSS с правилами, каскадно накладывающимися друг на друга, и более глубокие слои CSS вспыхивают перед применением верхнего слоя.
Решения jQuery в ответах, включающих добавление style="display:none"
к вашему элементу, решают эту проблему до тех пор, пока стиль удаляется достаточно поздно (фактически эти решения решают обе проблемы). Однако, если вы предпочитаете не добавлять стили непосредственно в ваш HTML, вы можете достичь тех же результатов, используя ng-show
.
Начиная с примера из вопроса:
<ul ng-show="foo != null" ng-cloak>..</ul>
Добавьте дополнительное правило ng-show к вашему элементу:
<ul ng-show="isPageFullyLoaded && (foo != null)" ng-cloak>..</ul>
(Вы должны сохранить, ng-cloak
чтобы избежать проблемы 1).
Затем в вашем наборе app.run isPageFullyLoaded
:
app.run(['$rootScope', function ($rootScope) {
$rootScope.$safeApply = function (fn) {
$rootScope.isPageFullyLoaded = true;
}
}]);
Имейте в виду, что в зависимости от того, что вы делаете, app.run может или не может быть лучшим местом для установки isPageFullyLoaded
. Важно убедиться, чтоisPageFullyLoaded
него установлено значение true, после того, что вы не хотите мигать, оно будет готово для показа пользователю.
Похоже, проблема 1 - это проблема, с которой сталкивается ОП, но другие находят, что решение не работает или работает только частично, потому что вместо них решается проблема 2 или также.
Важное примечание: Обязательно наносите растворы на оба нг-плаща, которые наносятся слишком поздно и удаляются в ближайшее время. Решение только одной из этих проблем может не облегчить симптомы.