我们在运用angular做SPA的时候,我们偶尔会出现表达式{{templatecontent}}或者是模块(div)闪烁的情况,而这类问题主要是出现在类如Chrome这类能快速解析的浏览器上。这是因为由于javascript去操作DOM,都会等待DOM加载完成(即 DOM ready)。对于angular而言,会在dom ready完成之后才回去解析html view template,所以会看到有闪烁的情况出现。而对于IE 7 8这类解析速度比较慢的浏览器而言,大部分情况你是看不到这样的情况的(好吧,突然发现巨坑的IE系列居然还有这样的好处,哈哈)。
<div>{ {templatecontent} }</div>
这样的写法大部分时候是没有问题的,但是在Chrome浏览器中偶尔会出现闪烁的情况。下面介绍两种解决方案:
方法一:
<div ng-bind="templatecontent"></div>
把模板内容直接绑定到ng-bind上,这样可以避免闪烁的情况出现
方法二:
<div ng-cloak>{ {templatecontent} }</div> <div ng-cloak class="ng-cloak">{ {templatecontent} }</div>
angular将ng-cloak实现为一个directive,并且会在初始化的时候在DOM的head中增加如下CSS代码:
@charset "UTF-8"; [ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;} ng\:form{display:block;} .ng-animate-start{clip:rect(0,auto,auto,0);-ms-zoom:1.0001;} .ng-animate-active{clip:rect(-1px,auto,auto,0);-ms-zoom:1;}
从上面的CSS代码可以看见angular将带有ng-cloak的元素设置为:display:none隐藏掉,在等到angular解析到带有ng-cloak的节点时,会把attribute和class同时remove掉,这样就能实现防止节点的闪烁情况的出现!
var ngCloakDirective = ngDirective({ compile: function(element, attr) { attr.$set('ngCloak', undefined); element.removeClass('ng-cloak'); } });
在angular-bootstrap.js中会看见这样的代码去增加前面所说的css:
document.write('<link rel="stylesheet" type="text/css" href="' + serverPath + '../css/angular.css"/>');
好像闪烁的问题好像已经能够被我解决了,恩是否是这样的,理论也该如此。如果浏览器的速度比angular在head中加入css的速度还快呢?我在给公司的一个项目组解决这个闪烁的问题的时候就遇见了这个问题。怎么办呢?那我们只能使出我们必杀技,自己把css加入我们的css文件引入heade,启动加载,ok这样就可以完美解决了。(如果你也遇见了加了ng-cloak还不起作用的话,那么试试直接引入css文件吧)