Prevent double curly brace notation from displaying momentarily before angular.js compiles/interpolates document

Angularjs

Angularjs Problem Overview


It seems to be primarily an issue in IE when there is a number of images/scripts to load, there can be a good amount of time where the literal {{stringExpression}} in the markup are displayed, then disappear once angular is done with it's compilation/interpolation of the document.

Is there a common reason why this would happen which would indicate I'm doing something generally wrong, or is there a known way to prevent this?

Angularjs Solutions


Solution 1 - Angularjs

I think that you are looking for the ngCloak directive: https://docs.angularjs.org/api/ng/directive/ngCloak

From the documentation: > The ngCloak directive is used to prevent the Angular html template > from being briefly displayed by the browser in its raw (uncompiled) > form while your application is loading. Use this directive to avoid > the undesirable flicker effect caused by the html template display. > > The directive can be applied to the <body> element, but the preferred usage is to apply multiple ngCloak > directives to small portions of the page to permit progressive rendering of the browser view

Solution 2 - Angularjs

Also, you can use <span ng-bind="hello"></span> instead of {{hello}}.

http://jsfiddle.net/4LhN9/34/

Solution 3 - Angularjs

To improve the effectiveness of class='ng-cloak' approach when scripts are loaded last, make sure the following css is loaded in the head of the document:

.ng-cloak { display:none; }

Solution 4 - Angularjs

Just add the cloaking CSS to the head of the page or to one of your CSS files:

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide {
	display: none !important;
}

Then you can use the ngCloak directive according to normal Angular practice, and it will work even before Angular itself is loaded.

This is exactly what Angular does: the code at the end of angular.js adds the above CSS rules to the head of the page.

Solution 5 - Angularjs

In your css add folllowing

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
    display: none !important;
 }

And then in you code you can add ng-cloak directive. For example,

<div ng-cloak>
   Welcome {{data.name}}
</div>

Thats it!

Solution 6 - Angularjs

You also can use ng-attr-src="{{variable}}" instead of src="{{variable}}" and the attribute will only be generated once the compiler compiled the templates. This is mentioned here in the documentation: https://docs.angularjs.org/guide/directive#-ngattr-attribute-bindings

Solution 7 - Angularjs

I agree with @pkozlowski.opensource answer, but ng-clock class did't work for me for using with ng-repeat. so I would like to recommend you to use class for simple delimiter expression like {{name}} and ngCloak directive for ng-repeat.

<div class="ng-cloak">{{name}}<div>

and

<li ng-repeat="item in items" ng-cloak>{{item.name}}<li>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJeremyWeirView Question on Stackoverflow
Solution 1 - Angularjspkozlowski.opensourceView Answer on Stackoverflow
Solution 2 - AngularjsAndrew JoslinView Answer on Stackoverflow
Solution 3 - AngularjsLOASView Answer on Stackoverflow
Solution 4 - AngularjsBennett McElweeView Answer on Stackoverflow
Solution 5 - AngularjsNathan SenevirathneView Answer on Stackoverflow
Solution 6 - AngularjsMartin SchüllerView Answer on Stackoverflow
Solution 7 - AngularjsJaison JamesView Answer on Stackoverflow