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 相关文章推荐
JQuery autocomplete 使用手册
Apr 01 Javascript
JS脚本defer的作用示例介绍
Jan 02 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
JavaScript中的类与实例实现方法
Jan 23 Javascript
QQ登录背景闪动效果附效果演示源码下载
Sep 22 Javascript
简单对比分析JavaScript中的apply,call与this的使用
Dec 04 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
Dec 08 Javascript
js鼠标跟随运动效果
Mar 11 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
Mar 02 Javascript
修改Vue打包后的默认文件名操作
Aug 12 Javascript
vue实现可移动的悬浮按钮
Mar 04 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 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
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
yii2安装详细流程
2018/05/23 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
js+css实现打字效果
2020/06/24 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
六行python代码的爱心曲线详解
2019/05/17 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
Python中如何添加自定义模块
2020/06/09 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
程序员经常用到的UNIX命令
2015/04/13 面试题
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
机关会计岗位职责
2014/04/08 职场文书
铁路安全事故反思
2014/04/26 职场文书
会计毕业生自荐书
2014/06/12 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
优秀高中学生评语
2014/12/30 职场文书
工作时间调整通知
2015/04/24 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server