angularjs的一些优化小技巧


Posted in Javascript onDecember 06, 2014

关于优化ng的手段网上已经有很多了,核心都是从$$watchers这个作用域内部属性说起的,今天我来说点别的,本质还是不变的,因为这是ng的硬伤,不过我相信只要运用合适的手法,这些问题还是可以避免的.

ng简介

angularjs简称ng,是google出品的mvvm框架,此在提高前端项目开发效率(实践中来看确实很能提高开发效率),以控制器,指令,服务来围绕整个项目,内部以独有的DI来解决三层之前的调用问题.更多的详情信息可以参考我之前写的ng源码分析.

ng的硬伤

说到硬伤就要先说下它的简单的数据绑定原理

ng里每个页面上定义的model其实都会在当前作用域下添加一个监听器,内部容器就是$$wachers数组,只要页面任何一个model发生变化了,就会触发作用域内部$digest方法,它会依次查找当前作用域树里的所有model,是保证页面上的模型能得到数据同步,所以这个是非常消耗程序时间的,官方的说法就是当页面上出现2000个监听器时,页面性能就会明显下降.所以要提高ng的性能,就要从这方面入手了.

tip1: 一次绑定

其实这个网上别人已经说过了,这里说下新的用法,ng的1.3.0+的版本已经内置提供了一个语法来支持模型只绑定一次的情况,看下面的例子:
old code

hello

new code
hello

可以看到新的语法就是在model前面加上::,相信这个语法要比网上用的第三方插件要方便的多了.

tip2: $scope.$digest vs $scope.$apply

相信很多人对$apply方法不陌生,它一般用在,当不在ng的环境里执行代码的时候,为了保证页面的数据同步,在代码执行完成之后调用$apply方法会触发内部$digest来检查作用域里所有的模型,其实在它的内部是这样调用的,下面只写出一些代码片段。
...

...

$rootScope.$digest

...

...

所有它其实是调用$rootScope根作用域下的$digest,那么不同作用域下的$digest有什么区别呢?其实最重要的区别就在于

$digest 只深度查找调用方下面所有的模型

所以$scope跟$rootScope相比,要节省掉很多查找模型的时间.

不过想要保证页面上所有模型数据的同步,还是得调用$rootScope的,所以在写代码之前最好想想哪些数据是要同步变化的.

tip3: 尽可能少调用 ng-repeat

ng-repeat默认会创建很多监听器,所以在数据量很大的时候,这个非常消耗页面性能,我觉的只有在当需要经常更新数据列表的时候才需要用ng-repeat,要不然放那么多的监听器在那里也是浪费,这时候可以用ng自带的$interpolate服务来解析一个代码片段,类似于一个静态模板引擎,它的内部主要依赖ng核心解析服务$parse,然后把这些填充数据之后的代码片段直接赋给一个一次性的模型性就可以.

tip4: 尽量在指令里写原生语法

虽然ng提供了很多的指令比如ng-show,ng-hide,其实它们作用就是根据模型的true,false来显示或隐藏一个代码片段,虽然能够很快速的实现业务要求,但是这些指令还是默认会添加监听器,假如这些代码片段存在于一个大的指令里面时,更好的方法是在指令link里编写.show(), .hide()这些类似的jq方法来控制比较好,这样可以节省监听器的数量,类似的还有自带的事件指令,这些其实都可以在外围指令里通过使用addEventListener来绑定事件,反正在写代码之前,最好想想怎么样来使监听器的数量最少,这样才能全面的提高页面性能.

tip5: 页面内尽量少用filters

当在页面内的模型后面增加filter时,这个会造成当前模型在$digest里运行两次,造成不必要的性能浪费.第一次在$$watchers检测任务改变时;第二次发生在模型值修改时,所以尽量少用内联时的过滤器语法,像下面这样的非常影响页面性能

推荐使用$filter服务来调用某个过滤器函数在后台,这样能明显的提高页面性能,代码如下

$filter('filter')(array, expression, comparator);

总结

上面都是些提高ng项目性能的一些小技巧,虽然ng很强大,但是不规范的代码也会破坏它的性能,所以在写代码之前最好构思下哪些地方是不需要监听器的.

Javascript 相关文章推荐
jquery实现控制表格行高亮实例
Jun 05 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
Aug 05 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
Aug 02 Javascript
Highcharts学习之数据列
Aug 03 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
jquery删除table当前行的实例代码
Oct 07 Javascript
angularjs 中$apply,$digest,$watch详解
Oct 13 Javascript
详解Vue 多级组件透传新方法provide/inject
May 09 Javascript
JavaScript中import用法总结
Jan 20 Javascript
vue el-table实现行内编辑功能
Dec 11 Javascript
Element中Slider滑块的具体使用
Jul 29 Javascript
javascript实现京东快递单号的查询效果
Nov 30 Javascript
JavaScript开发人员的10个关键习惯小结
Dec 05 #Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 #Javascript
node.js中实现同步操作的3种实现方法
Dec 05 #Javascript
node.js实现BigPipe详解
Dec 05 #Javascript
js实现点击添加一个input节点
Dec 05 #Javascript
Node.js实现的简易网页抓取功能示例
Dec 05 #Javascript
浅谈js的setInterval事件
Dec 05 #Javascript
You might like
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
Python实现学校管理系统
2018/01/11 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
Django框架安装方法图文详解
2019/11/04 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
阿巴庭院:Abba Patio
2019/06/18 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
DIY手工制作经营店创业计划书
2014/02/01 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
表扬信格式模板
2015/05/05 职场文书
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android