I have an issue in angularjs with directive/class ng-cloak
or ng-show
.
Chrome works fine, but Firefox is causing blink of elements with ng-cloak
or ng-show
.
IMHO it's caused by the converting ng-cloak
/ng-show
to style="display: none;"
, probably the FF javascript compiler is little bit slower, so the elements appears for a while and then hide?
Example:
<ul ng-show="foo != null" ng-cloak>..</ul>
I would appreciate any tips or help, it's very annoying,
Though the documentation doesn't mention it, it might not be enough to add the display: none;
rule to your CSS. In cases where you are loading angular.js in the body or templates aren't compiled soon enough, use the ng-cloak
directive and include the following in your CSS:
/*
Allow angular.js to be loaded in body, hiding cloaked elements until
templates compile. The !important is important given that there may be
other selectors that are more specific or come later and might alter display.
*/
[ng\:cloak], [ng-cloak], .ng-cloak {
display: none !important;
}
As mentioned in the comment, the !important
is important. For example, if you have the following markup
<ul class="nav">
<li><a href="/foo" ng-cloak>{{bar}}</a></li>
</ul>
and you happen to be using bootstrap.css
, the following selector is more specific for your ng-cloak
'ed element
.nav > li > a {
display: block;
}
So if you include a rule with simply display: none;
, Bootstrap's rule will take precedence and the display
will be set to block
, so you'll see the flicker before the template compiles.
As mentioned in the documentation, you should add a rule to your CSS to hide it based on the ng-cloak
attribute:
[ng\:cloak], [ng-cloak], .ng-cloak {
display: none;
}
We use similar tricks on the "Built with Angular" site, which you can view the source of on Github: https://github.com/angular/builtwith.angularjs.org
Hope that helps!
Make sure AngularJS is included in the head
of the HTML. See ngCloak doc:
For the best result, angular.js script must be loaded in the head section of the html file; alternatively, the css rule (above) must be included in the external stylesheet of the application.
ngBind and ngBindTemplate are alternatives that do not require CSS:
<div ng-show="foo != null" ng-cloak>{{name}}</div> <!-- requires CSS -->
<div ng-show="foo != null" ng-bind="name"></div>
<div ng-show="foo != null" ng-bind-template="name = {{name}}"></div>
In addition to the accepted answer if you're using an alternative method of triggering ng-cloak...
You may also wish to add some additional specificities to your CSS/LESS:
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
.ng-cloak, .x-ng-cloak,
.ng-hide {
display: none !important;
}
I've never had much luck using ngCloak. I still get flickering despite everything mentioned above. The only surefire way to avoid flicking is to put your content in a template and include the template. In a SPA, the only HTML that will get evaluated before being compiled by Angular is your main index.html page.
Just take everything inside the body and stick it in a separate file and then:
<ng-include src="'views/indexMain.html'"></ng-include>
You should never get any flickering that way as Angular will compile the template before adding it to the DOM.
I had a similar issue and found out that if you have a class that contains transitions, the element will blink. I tried to add ng-cloak without success, but by removing the transition the button stopped blinking.
I'm using ionic framework and the button-outline has this transition
.button-outline {
-webkit-transition: opacity .1s;
transition: opacity .1s;
}
Simply overwrite the class to remove the transition and the button will stop blinking.
Update
Again on ionic there is a flicker when using ng-show/ng-hide. Adding the following CSS resolves it:
.ng-hide-add,
.ng-hide-remove {
display: none !important;
}
Source: http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9
For what it's worth, I had a similar issue ng-cloak not working. It may be worth checking your app/site with cache enabled to reuse source files to see if that helps.
With my run-in with flickering, I was testing with DevTools open and cache disabled. Leaving the panel closed with caching enabled fixed my issue.
We ran into this problem at our company and solved it by adding "display: none" to the CSS styling for those flickering ng-show elements. We didn't have to use ng-cloak at all. Unlike others in this thread, we experienced this issue in Safari but not Firefox or Chrome -- possibly due to Safari's lazy repaint bug in iOS7.
I was having no luck with ng-cloak
and it turned out ng-show
was a much more effective solution for my use case. This may be the case for anyone landing here as well.
(I had a form I didn't want to load until a certain promise in my controller had resolved.)
In addition to other answers, if you find the flash of template code to still be occuring it is likely you have your scripts at the bottom of the page and that means that the ng-cloak directive straight up will not work. You can either move your scripts to the head or create a CSS rule.
The docs say "For the best result, the angular.js script must be loaded in the head section of the html document; alternatively, the css rule above must be included in the external stylesheet of the application."
Now, it doesn't have to be an external stylesheet but just in a element in the head.
<style type="text/css">
.ng-cloak {
display: none !important;
}
</style>
I would would wrap the <ul>
with a <div ng-cloak>
Keeping the below statements in head tag fixed this issue
<style type="text/css">
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
display: none !important;
}
</style>