У меня есть проблема в angular.js с директивой / класс ng-cloak
или ng-show
.
Chrome работает нормально, но Firefox вызывает мигание элементов с помощью ng-cloak
или ng-show
. ИМХО, это вызвано преобразованием ng-cloak
/ ng-show
в style="display: none;"
, вероятно, компилятор JavaScript Firefox немного медленнее, поэтому элементы появляются на некоторое время, а затем скрываются?
Пример:
<ul ng-show="foo != null" ng-cloak>..</ul>
javascript
class
angularjs
MelkorNemesis
источник
источник
Ответы:
Хотя в документации это не упоминается, этого может быть недостаточно для добавления
display: none;
правила в ваш CSS. В случаях, когда вы загружаете angular.js в тело или шаблоны не скомпилированы достаточно быстро, используйтеng-cloak
директиву и включите в свой CSS следующее:Как уже упоминалось в комментарии,
!important
это важно. Например, если у вас есть следующая разметкаи вы случайно используете
bootstrap.css
, следующий селектор более специфичен для вашегоng-cloak
элементаПоэтому, если вы включите правило просто
display: none;
, правило Bootstrap будет иметь приоритет, иdisplay
будет установлено значениеblock
, так что вы увидите мерцание перед компиляцией шаблона.источник
:
вng:cloak
не экранированы. Для чистого CSS убедитесь, что есть обратный слеш. Для скомпилированного CSS, например, Stylus, это будет[ng\\:cloak]
. Проверьте ваш скомпилированный CSS, чтобы убедиться, что он правильный.Как упомянуто в документации , вы должны добавить правило в свой CSS, чтобы скрыть его на основе
ng-cloak
атрибута:Мы используем аналогичные приемы на сайте «Built with Angular», источник которого вы можете посмотреть на Github: https://github.com/angular/builtwith.angularjs.org
Надеюсь, это поможет!
источник
Убедитесь, что AngularJS включен в
head
HTML. Видеть документ ngCloak :источник
ng-cloak
работает сейчас.head
таблицу стилей, но после, не решает проблему.У меня никогда не было большой удачи, используя ngCloak. Я все еще мерцаю, несмотря на все вышеизложенное. Единственный надежный способ избежать флик - это поместить ваш контент в шаблон и включить шаблон. В SPA единственным HTML, который будет оценен перед компиляцией Angular, является ваша главная страница index.html.
Просто возьмите все внутри тела и вставьте в отдельный файл, а затем:
Вы никогда не должны мерцать таким образом, так как Angular скомпилирует шаблон перед добавлением его в DOM.
источник
ng-include
создается дополнительный запрос AJAX для получения содержимого с сервера. Я, например, усвоил тяжелый способ, которым вы никогда не должны пользоватьсяng-include
внутриng-repeat
.ng-app
внеng-include
в вашей разметке.ngBind и ngBindTemplate являются альтернативами, которые не требуют CSS:
источник
ng-bind
это хороший способ избежать использования «фигурных скобок» или использованияng-cloak
на уровне тегов, хотя некоторые считают, что это делает код менее читабельным. Для них я не вижу причины не смешивать два подхода.В дополнение к принятому ответу, если вы используете альтернативный метод запуска ng-cloak ...
Вы также можете добавить некоторые дополнительные особенности к вашему CSS / LESS:
источник
У меня была похожая проблема, и я обнаружил, что если у вас есть класс, содержащий переходы, элемент будет мигать. Я безуспешно пытался добавить нг-плащ, но при удалении перехода кнопка перестала мигать.
Я использую ионный каркас и контур кнопки имеет этот переход
Просто перезапишите класс, чтобы удалить переход, и кнопка перестанет мигать.
Обновить
Опять же на ионном появляется мерцание при использовании ng-show / ng-hide. Добавление следующего CSS разрешает это:
Источник: http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9
источник
.button-clear, .button-icon, .button-outline { @include transition(opacity 0s); }
к своему scss.У меня была проблема, когда
<div ng-show="expression">
был бы изначально виден в течение доли секунды, даже если «expression» было изначально ложным, прежде чем директива ng-show получила шанс на запуск.Решение, которое я использовал, состояло в том, чтобы вручную добавить класс ng-hide
<div ng-show="expression" ng-hide>
, чтобы убедиться, что он изначально был скрыт. После этого директива ng-show добавит / удалит класс ng-hide по мере необходимости.источник
Попробуйте выключить Firebug . Я серьезно. Это помогает в моем случае.
Примените принятый ответ, а затем убедитесь, что Firebug в вашем Firefox выключен : нажмите F12, затем выключите Firebug для этой страницы - маленькую кнопку в правом верхнем углу.
источник
На самом деле есть две отдельные проблемы, которые могут вызвать проблему мерцания, и вы можете столкнуться с одной или обеими из них.
Проблема 1: нг-плащ применяется слишком поздно
Эта проблема решена, как описано во многих ответах на этой странице, чтобы убедиться, что AngularJS загружен в голову. Смотрите документ ngCloak :
Проблема 2: нг-плащ удаляется слишком рано
Скорее всего, эта проблема возникает, когда у вас на странице много CSS с правилами, каскадно накладывающимися друг на друга, и более глубокие слои CSS вспыхивают перед применением верхнего слоя.
Решения jQuery в ответах, включающих добавление
style="display:none"
к вашему элементу, решают эту проблему до тех пор, пока стиль удаляется достаточно поздно (фактически эти решения решают обе проблемы). Однако, если вы предпочитаете не добавлять стили непосредственно в ваш HTML, вы можете достичь тех же результатов, используяng-show
.Начиная с примера из вопроса:
Добавьте дополнительное правило ng-show к вашему элементу:
(Вы должны сохранить,
ng-cloak
чтобы избежать проблемы 1).Затем в вашем наборе app.run
isPageFullyLoaded
:Имейте в виду, что в зависимости от того, что вы делаете, app.run может или не может быть лучшим местом для установки
isPageFullyLoaded
. Важно убедиться, чтоisPageFullyLoaded
него установлено значение true, после того, что вы не хотите мигать, оно будет готово для показа пользователю.Похоже, проблема 1 - это проблема, с которой сталкивается ОП, но другие находят, что решение не работает или работает только частично, потому что вместо них решается проблема 2 или также.
источник
Мы столкнулись с этой проблемой в нашей компании и решили ее, добавив «display: none» в стиль CSS для тех мерцающих элементов ng-show. Нам не нужно было использовать нг-плащ вообще. В отличие от других в этой теме, мы сталкивались с этой проблемой в Safari, но не в Firefox или Chrome - возможно, из-за ленивой ошибки перерисовки Safari в iOS7 .
источник
Для чего это стоит, у меня была похожая проблема нг-плащ не работает. Возможно, стоит проверить ваше приложение / сайт с включенным кэшем, чтобы повторно использовать исходные файлы, чтобы выяснить, помогает ли это.
При запуске с мерцанием я тестировал с открытым DevTools и отключенным кешем. Закрытие панели с включенным кэшированием исправило мою проблему.
источник
Хранение приведенных ниже утверждений в заголовке тега исправило эту проблему
официальная документация
источник
Я не смог заставить работать ни один из этих методов, поэтому в итоге я сделал следующее. Для элемента, который вы хотите изначально скрыть:
Затем в вашем контроллере добавьте это вверху или около него:
Таким образом, элемент изначально скрыт и отображается только тогда, когда код контроллера действительно запущен.
Вы можете настроить размещение под свои нужды, возможно, добавив немного логики. В моем случае я переключаюсь на путь входа в систему, если в данный момент не вошел в систему, и не хотел, чтобы мой интерфейс мерцал заранее, поэтому я установил
$scope.style
после проверки входа в систему.источник
Лучше использовать
ng-if
вместоng-show
.ng-if
полностью удаляет и воссоздает элемент в DOM и помогает избежать мигания ng-шоу.источник
Я использую ионные рамки, добавление стиля CSS может не работать в определенных обстоятельствах, вы можете попробовать использовать ng-if вместо ng-show / ng-hide
ref: https://books.google.com.my/books?id=-_5_CwAAQBAJ&pg=PA138&lpg=PA138&dq=ng-show+hide+flickering+in+ios&source=bl&ots=m2Turk8DFh&sig=8hNiWx26ek&h_x_x&i_x_d&i_x_d_x_d_x_d_d_x_d_v_d_v_d_v_d_v_d_v_d_v_d_v_d_d_v_k = OnePage & д = нг-шоу% 20hide% 20flickering% 20in% 20ios & F = ложь
источник
вам лучше ссылаться на угловой документ, потому что версия [1.4.9] имеет обновление ниже, чтобы оно могло поддерживать директиву data-ng-cloak.
источник
Я попробовал решение ng-cloak выше, но оно по-прежнему имеет проблемы с Firefox. Единственный обходной путь, который мне помог, - это задержать загрузку формы до полной загрузки Angular.
Я просто добавил ng-init в приложение и использую ng-if на стороне формы, чтобы проверить, загружена ли заданная мною переменная.
источник
В дополнение к другим ответам, если вы обнаружите, что вспышка кода шаблона все еще происходит, вероятно, ваши скрипты находятся внизу страницы, а это означает, что директива ng-cloak прямо вверх не будет работать. Вы можете переместить свои сценарии в голову или создать правило CSS.
В документации сказано: «Для достижения наилучшего результата скрипт angular.js должен быть загружен в раздел head документа html; в качестве альтернативы приведенное выше правило css должно быть включено во внешнюю таблицу стилей приложения».
Теперь это не должна быть внешняя таблица стилей, а просто элемент в голове.
источник: https://docs.angularjs.org/api/ng/directive/ngCloak
источник
Я попробовал каждое решение, опубликованное здесь, и все еще мерцало в Firefox.
Если это кому-нибудь поможет, я решил это, добавив
style="display: none;"
к основному контенту div, а затем используя jQuery (я уже использовал его на странице),$('#main-div-id').show();
когда все было загружено после получения данных с сервера;источник
На самом деле я обнаружил, что предложение из веб-журнала Рика Страла отлично исправило мою проблему (поскольку у меня все еще была странная проблема с нг-плащом, мигавшим raw {{code}} время от времени, особенно во время работы Firebug):
Ядерный вариант: скрытие контента вручную
Использование явного CSS - лучший выбор, поэтому в следующем не должно быть необходимости. Но я упомяну это здесь, так как это дает некоторое представление о том, как вы можете скрыть / показать контент вручную при загрузке для других платформ или в ваших собственных шаблонах на основе разметки.
Прежде чем я понял, что могу явно встроить стиль CSS в страницу, я попытался выяснить, почему ng-cloak не выполняет свою работу. Потратив час на то, чтобы никуда не деваться, я наконец решил просто вручную спрятать и показать контейнер. Идея проста - сначала спрячьте контейнер, затем покажите его, как только Angular выполнит первоначальную обработку и удалит разметку шаблона со страницы.
Вы можете вручную скрыть содержимое и сделать его видимым после того, как Angular получит контроль. Для этого я использовал:
Обратите внимание на отображение: ни один из стилей, который явно скрывает элемент изначально на странице.
Затем, как только Angular запустит свою инициализацию и эффективно обработает разметку шаблона на странице, вы сможете показать содержимое. Для Angular это событие 'ready' является функцией app.run ():
Это эффективно удаляет отображение: стиль отсутствует, а содержимое отображается. К моменту запуска app.run () DOM готов к отображению с заполненными данными или, по крайней мере, с пустыми данными - Angular уже получил контроль.
источник
Я перепробовал все ответы выше и ничего не получалось. Использовал ionic для разработки гибридного приложения и пытался заставить сообщение об ошибке не мерцать. Я решил проблему, добавив класс ng-hide к своему элементу. У моего div уже есть ng-show, чтобы показать элемент при возникновении ошибки. При добавлении ng-hide установите div, чтобы он не отображался до загрузки angular. Никакой нг-плащ или добавление углов на голову не требуется.
источник
КАК из приведенного выше обсуждения
это идеальный способ решить проблему.
источник
Я использую ng-show в директиве, чтобы показать и скрыть всплывающие окна.
Ничто из вышеперечисленного не сработало для меня, и использование ng-if вместо ng-show было бы излишним. Это подразумевало бы удаление и добавление всего всплывающего содержимого в DOM при каждом нажатии. Вместо этого я добавил ng-if в тот же элемент, чтобы он не отображался при загрузке документа:
После этого я добавил инициализацию в контроллер, ответственный за эту директиву, с таймаутом:
Таким образом, я устранил проблему мерцания и избежал дорогостоящей операции вставки DOM при каждом щелчке. Это произошло за счет использования двух переменных области видимости для одной цели вместо одной, но пока это определенно лучший вариант.
источник
Пробовал,
ng-cloak
но все еще недолго моргает. Ниже код избавит их полностью.источник
Ни одно из перечисленных выше решений не помогло мне. Затем я решил взглянуть на саму функцию и понял, что когда запускается «$ scope.watch», он помещает значение в поле имени, чего не должно быть. Таким образом, в коде, который я установил и oldValue и newValue тогда
По сути, когда в этом случае запускается scope.watch, AngularJS отслеживает изменения в переменной name (model.value)
источник
Я бы завернула
<ul>
с собой<div ng-cloak>
источник
<ul>
.ng-cloak
будет скрывать любой элемент, к которому он применяется, а также потомков этого элемента.Я лично решил использовать
ng-class
атрибут, а неng-show
. Я добился гораздо большего успеха, пройдя этот путь, особенно для всплывающих окон, которые всегда не показываются по умолчанию.Что раньше было
<div class="options-modal" ng-show="showOptions"></div>
сейчас:
<div class="options-modal" ng-class="{'show': isPrintModalShown}">
с CSS для опционального модального класса
display: none
по умолчанию. Класс show содержитdisplay:block
CSS.источник
Избегайте разрыва строки
Работает с Firefox 45.0.1
источник