En realidad, hay dos problemas separados que pueden causar el problema de parpadeo y podría enfrentarse a uno o ambos.
Problema 1: ng-cloak se aplica demasiado tarde
Este problema se resuelve como se describe en muchas de las respuestas en esta página para asegurarse de que AngularJS esté cargado en la cabeza. Ver ngCloak doc :
Para obtener el mejor resultado, el script angular.js debe cargarse en la sección de cabecera del archivo html; alternativamente, la regla css (arriba) debe incluirse en la hoja de estilo externa de la aplicación.
Problema 2: ng-cloak se quita demasiado pronto
Es muy probable que este problema ocurra cuando tiene una gran cantidad de CSS en su página con reglas en cascada entre sí y las capas más profundas de CSS parpadean antes de que se aplique la capa superior.
Las soluciones jQuery en las respuestas que implican agregar style="display:none"
a su elemento resuelven este problema siempre que el estilo se elimine lo suficientemente tarde (de hecho, estas soluciones resuelven ambos problemas). Sin embargo, si prefiere no agregar estilos directamente a su HTML, puede lograr los mismos resultados con ng-show
.
Comenzando con el ejemplo de la pregunta:
<ul ng-show="foo != null" ng-cloak>..</ul>
Agregue una regla ng-show adicional a su elemento:
<ul ng-show="isPageFullyLoaded && (foo != null)" ng-cloak>..</ul>
(Debe mantener ng-cloak
para evitar el problema 1).
Luego, en su conjunto de aplicaciones isPageFullyLoaded
.
app.run(['$rootScope', function ($rootScope) {
$rootScope.$safeApply = function (fn) {
$rootScope.isPageFullyLoaded = true;
}
}]);
Tenga en cuenta que, dependiendo de exactamente lo que esté haciendo, app.run puede o no ser el mejor lugar para configurar isPageFullyLoaded
. Lo importante es asegurarse de que isPageFullyLoaded
se establezca como verdadero después de que lo que no desea parpadear esté listo para ser revelado al usuario.
Parece que el problema 1 es el problema que está enfrentando el OP, pero otros están descubriendo que la solución no funciona o solo funciona parcialmente porque están golpeando el problema 2 en su lugar o también.
Nota importante: asegúrese de aplicar soluciones tanto a la capa ng que se aplica demasiado tarde como a la que se retira demasiado pronto. Resolver solo uno de estos problemas puede no aliviar los síntomas.