AngularJS中的Directive实现延迟加载


Posted in Javascript onJanuary 25, 2016

所谓的延迟加载通常是:直到用户交互时才加载。如何实现延迟加载呢?

需要搞清楚三个方面:

1、html元素的哪个属性需要延迟加载?
2、需要对数据源的哪个字段进行延迟加载?
3、通过什么事件来触发延迟加载?

自定义的Directive的页面表现大致是这样:

<ul>
<li ng-repeat="cust in customers"
delay-bind="{{::cust.street}}"
attribute="title"
trigger="mouseenter">
<a delay-bind="{{::cust.url}}"
attribute="href"
trigger="mouseenter">
{{cust.name}}
</a>
</li>
</ul>
<div>Total Cusotmers: {{::customers.length}}</div>

以上,
● delay-bind表示要从数据源中取出的某个字段值
● attribute表是html元素属性,对该属性延迟赋值
● trigger表示通过那个事件来触发延迟加载

Directive代码大致如下:

//interpolate的存在允许one-time一次性绑定
(function(){
var delayBindWithCompile = ['$interpolate', function($interpolate){
var compile = fucntion(tElem, tAttrs){
//delay-bind="{{::cust.street}}"
//这里返回的是一个函数,也就相当于针对street属性的编译开始,相当于把编译的功能先缓存在这里
var interpolateFunc = $interpolate(tAttrs.delayBind);
//重新设置delayBind的属性值,这时候DOM还没有加载呢
tAttrs.$set('delayBind', null); //相当于清除属性值
return {
pre: function(scope, elem, attrs){
},
post: function(scope, elem, attrs){
//trigger="mouseenter"
elem.on(attrs.trigger, function(event){
//attribute="title" 这里title是表示真正要延迟更新的属性
var attr = atts.attribute,
val = interpolateFunc(scope); //编译真正执行
if(attr && !elem.attr(attr)){
elem.attr(attr, val);
}
});
}
}
};
return {
restrict: 'A',
compile: compile
}
}];
angular.module('directivesModule')
.directive('delayBind', delayBindWithCompile);
}());

以上,compile方法中用到了$interpolate服务,$interpolate这个服务首先可以通过$interpolate(tAttrs.delayBind)把数据源某个字段的属性值先编译缓存起来,在post-link,也就是这里的post函数中,当触发引起延迟加载的事件,再让$interpolate服务开始编译把值赋值给html元素的某个属性。

以上所述是针对AngularJS中的Directive实现延迟加载的相关内容,希望对大家有所帮助。

Javascript 相关文章推荐
ie8本地图片上传预览示例代码
Jan 12 Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
Nov 24 Javascript
jQuery Validate表单验证深入学习
Dec 18 Javascript
jquery实现界面无刷新加载登陆注册
Jul 30 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
JS数组方法join()用法实例分析
Jan 18 Javascript
JavaScript中的this原理及6种常见使用场景详解
Feb 14 Javascript
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
AngularJS中的Directive自定义一个表格
Jan 25 #Javascript
理解JavaScript事件对象
Jan 25 #Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
Jan 25 #Javascript
学习JavaScript事件流和事件处理程序
Jan 25 #Javascript
javascript产生随机数方法汇总
Jan 25 #Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
Jan 25 #Javascript
理解JavaScript表单的基础知识
Jan 25 #Javascript
You might like
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
laravel请求参数校验方法
2019/10/10 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
python async with和async for的使用
2019/06/20 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python3.8下载及安装步骤详解
2020/01/15 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
详解Python IO编程
2020/07/24 Python
python实现取余操作的简单实例
2020/08/16 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
人事助理岗位职责
2013/11/18 职场文书
4s客服专员岗位职责
2013/12/01 职场文书
电钳专业个人求职信
2014/01/04 职场文书
教师求职自荐信
2015/03/26 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL