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 相关文章推荐
js 操作符实例代码
Oct 24 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
Dec 26 Javascript
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
js函数返回多个返回值的示例代码
Nov 05 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
浅析JavaScript中的array数组类型系统
Jul 18 Javascript
jQuery包裹节点用法完整示例
Sep 13 Javascript
Vue.js中兄弟组件之间互相传值实例
Jun 01 Javascript
Angular4绑定html内容出现警告的处理方法
Nov 03 Javascript
vue slot与传参实例代码讲解
Apr 28 Javascript
H5+css3+js搭建带验证码的登录页面
Oct 11 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 Javascript
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
php异常处理使用示例
2014/02/25 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
javascript用rem来做响应式开发
2018/01/13 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
少先队入队活动方案
2014/02/08 职场文书
个性与发展自我评价
2015/03/06 职场文书
求职导师推荐信范文
2015/03/27 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
python cv2图像质量压缩的算法示例
2021/06/04 Python