I have an AngularJS project, I want to prevent a FOUC during page load on a classname. I've read about ng-template but that seems useful only for content within a tag.
<body class="{{ bodyClass }}">
I would like it to be "login" on page load. Any strategy for this? Or do I just have to fudge it and load it as 'login' and manually use javascript to to tweak the DOM just for this instance.
One of the problems that you're facing is that the browser will display the
<body>
element before AngularJS has loaded and started manipulating the DOM. What other people said aboutng-class
is correct, it will do the right class applying but you still need to not show anything before Angular is ready.In previous versions of Angular you could do this:
In recent versions this doesn't work however because
ng-show
does its visibility by adding and removing theng-hide
class (which is less specific than an element attribute)What I've been doing recently is this:
Doing it this way means that the
<body>
will be immediately hidden by the style for theng-cloak
class. When Angular does start up it will process all of the directives includeng-class
andng-cloak
, so your<body>
element will then have the right class and be visible.Read more here ng-cloak directive
There is a solution to the flash problem in plain CSS which is bulletproof. For the class of your app root element add the following. This solution works by order of processing: everything is hidden in CSS, angular is loaded, and then CSS shows the app root. I like to use this so if there are other non-angular elements on the page they will render first making the page appear to load faster.
Just before the body ends add your script references and some inline CSS:
I've noticed sometimes even ng-cloak doesn't seem to actually work. Maybe I am doing something wrong.
I also do one more small thing similar to @mbokil you can hide the element by default. By using an attribute selector targeting any elements with the attribute ng-cloak you're able to utilize angular directives. This has several benefits, but the main benefit is once angular fires it removes this attribute which will trigger a redraw.
What you are looking for is
ng-cloak
.You have to add it like this:
and this will prevent unwanted flashing.
Link to docs about this.
Edit:
It is also advisable to put the snippet below into your CSS file, according to docs.
Instead of using class, you should use ng-class