Search code examples
javascriptangularjsperformancengcloak

AngularJS shows model text before compilation despite ng-cloak


I'm working on a page that has to run on an embedded android system (in the system webview), and this thing is tragically slow. So slow in fact, that when you load a page, somtimes the model text is still on the page for a good half second before AngularJS gets around to updating all of the bindings. This is annoying and clearly undesirable.

I've added ng-cloak to endless permutations of elements of the page. I've also added the following style to the style sheet:

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

It just doesn't want to cloak the contents, and I think ionic is to blame. Not knowing a lot about AngularJS, I tried writing a directive my-cloak that added a class to the element on compile and pre-link and removed it on post link. It worked better, but it didn't work always.

I've read about some more things I could do like "decorating" the interpolation function (getting out of my depth) and maybe one of the various suggestions listed here (like evalAsync or something like that) but I don't know enough about Angular to understand what those solutions actually do. Coming from a jQuery background is very hard when transitioning to AngularJS.

So any help would be really appreciated. I just want to prevent the undigested text from ever showing on the screen, basically doing what ng-cloak is supposed to do but for slower systems. Thanks!


Solution

  • This is not an answer you are looking for, but there is a good practice to write

    <span ng-bind="data">&nbsp;</span> 
    

    (so no {{data}} blinking).

    • ng-cloak styles already on the page. Look in the header of rendered page with angular app.

    • you can do something like:

    <body ng-show="loaded"></body> and set scope.loaded = true in controller, after data is loaded.