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 相关文章推荐
漂亮的仿flash菜单,来自蓝色经典
Jun 26 Javascript
jQuery实现切换页面布局使用介绍
Oct 09 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
JS定时器实例
Apr 17 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
Sep 25 Javascript
js中arguments,caller,callee,apply的用法小结
Jan 28 Javascript
jquery制作图片时钟特效
Mar 30 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
AngularJS中的缓存使用
Jan 11 Javascript
angular+bootstrap的双向数据绑定实例
Mar 03 Javascript
vscode下vue项目中eslint的使用方法
Jan 13 Javascript
刷新页面后让控制台的js代码继续执行
Sep 20 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 mysql Errcode: 28 终极解决方法
2009/07/01 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
javascript编写简易计算器
2017/05/06 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
Python程序设计入门(2)变量类型简介
2014/06/16 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Python autoescape标签用法解析
2020/01/17 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
图书馆义工感想
2015/08/07 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS