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 过滤not()与filter()实例代码
May 10 Javascript
利用jQuery实现可输入搜索文字的下拉框
Oct 23 Javascript
jquery ajax post提交数据乱码
Nov 05 Javascript
8个实用的jQuery技巧
Mar 04 Javascript
Egret引擎开发指南之发布项目
Sep 03 Javascript
JavaScript Length 属性的总结
Nov 02 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 Javascript
基于JS设计12306登录页面
Dec 28 Javascript
vue源码nextTick使用及原理解析
Aug 13 Javascript
使用Promise封装小程序wx.request的实现方法
Nov 13 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 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打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
Linux下编译安装MySQL-Python教程
2015/02/02 Python
python入门教程 python入门神图一张
2018/03/05 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
python中必要的名词解释
2019/11/20 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
农行实习自我鉴定
2013/09/22 职场文书
城市规划毕业生求职信
2013/10/10 职场文书
在职研究生自我鉴定
2013/10/16 职场文书
会计学生自我鉴定
2014/02/06 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
关于幸福的感言
2015/08/03 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书