AngularJS使用ng-Cloak阻止初始化闪烁问题的方法


Posted in Javascript onNovember 03, 2016

本文实例讲述了AngularJS使用ng-Cloak阻止初始化闪烁问题的方法。分享给大家供大家参考,具体如下:

在做angular的SPA开发时,我们经常会遇见在如Chrome这类能够快速解析的浏览器上出现表达式({% raw %} {{ express }} {% endraw %} ),或者是模块(div)的闪烁。对于这个问题由于JavaScript去操作DOM,都会等待DOM加载完成(DOM ready)。对于angular会在DOM ready完会才回去解析html view Template,所以对于Chrome这类快速的浏览器你会看见有闪烁的情况出现。而对于IE7,8这类解析稍慢的浏览器大部分情况下是不会出现这个问题的。

angular中为我们提供了ng-cloak来实现防止闪烁的方案,我们只需要在需要的地方加上ng-cloak。同时对于bing文字({% raw %}{{ express }} {% endraw %})我们也可以改为ng-bind来实现避免。

<div id="template1" ng-cloak>{{ 'hello' }}</div>
<div id="template2" ng-cloak class="ng-cloak">{% raw %} {{ 'hello IE7' }} {% endraw %} </div>
<div id="template2" ng-bing="'hello IE7'"></div>

angular将ng-cloak实现为一个directive,并会在初始化的时候在DOM的heade增加一行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;}

从上面我们可以看见angular将带有ng-clock的的元素设置为display:none,隐藏掉,在等到angular解析到带有ng-clock的节点时候,会把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文件吧)

到这里关于ng-cloak的原理和解决方案已经完成。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
详解Javascript事件驱动编程
Jan 03 Javascript
JavaScript代码里的判断小结
Aug 22 Javascript
JS实现复制功能
Mar 01 Javascript
基于JavaScript实现无限加载瀑布流
Jul 21 Javascript
微信小程序之前台循环数据绑定
Aug 18 Javascript
vue proxyTable 接口跨域请求调试的示例
Sep 12 Javascript
解决vue.js this.$router.push无效的问题
Sep 03 Javascript
深入了解js原型模式
May 30 Javascript
layer父页获取弹出层输入框里面的值方法
Sep 02 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
JS加载解析Markdown文档过程详解
May 19 Javascript
vue打包npm run build时候界面报错的解决
Aug 13 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 #Javascript
vue自定义指令实现v-tap插件
Nov 03 #Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 #Javascript
vue.js指令v-for使用及索引获取
Nov 03 #Javascript
vue.js初学入门教程(1)
Nov 03 #Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
Nov 03 #Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
Nov 03 #Javascript
You might like
基于mysql的论坛(4)
2006/10/09 PHP
php mysql索引问题
2008/06/07 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
通过javascript设置css属性的代码
2009/12/28 Javascript
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
canvas绘制多边形
2017/02/24 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
利用Psyco提升Python运行速度
2014/12/24 Python
python定时执行指定函数的方法
2015/05/27 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
python groupby 函数 as_index详解
2019/12/16 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
田径运动会开幕式及主持词
2014/03/28 职场文书
简单租房协议书
2014/04/09 职场文书
绿色环保标语
2014/06/12 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
个人创业事迹材料
2014/12/30 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书