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 相关文章推荐
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
标准的js无缝滚动效果
Aug 30 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 Javascript
使用jQuery操作DOM的方法小结
Feb 27 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
webpack配置打包后图片路径出错的解决
Apr 26 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
Element PageHeader页头的使用方法
Jul 26 Javascript
vue+springboot实现登录验证码
May 27 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
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
php中上传文件的的解决方案
2018/09/25 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
Python重新引入被覆盖的自带function
2014/07/16 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
如何理解python中数字列表
2020/05/29 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
公司活动策划方案
2014/01/13 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
活动宣传策划方案
2014/05/23 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
教师党员个人自我评价
2015/03/04 职场文书
转学证明范本
2015/06/19 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
高一作文之暖冬
2019/11/09 职场文书
Python打包为exe详细教程
2021/05/18 Python
MongoDB支持的数据类型
2022/04/11 MongoDB