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 程序库的比较(一)之DOM功能
Apr 07 Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 Javascript
JavaScript数组对象赋值用法实例
Aug 04 Javascript
学习JavaScript设计模式(多态)
Nov 25 Javascript
JS插件overlib用法实例详解
Dec 26 Javascript
jQuery如何获取动态添加的元素
Jun 24 Javascript
jQuery组件easyui基本布局实现代码
Aug 25 Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 Javascript
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 Javascript
解析vue、angular深度作用选择器
Sep 11 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 Javascript
Node.js fs模块原理及常见用途
Oct 22 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
React组件的三种写法总结
2017/01/12 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
python 中random模块的常用方法总结
2017/07/08 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
Django返回HTML文件的实现方法
2020/09/17 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
公司合作意向书
2014/04/01 职场文书
机关党员公开承诺书
2014/08/30 职场文书
怎样写观后感
2015/06/19 职场文书
入门学习Go的基本语法
2021/07/07 Golang
Redis基本数据类型String常用操作命令
2022/06/01 Redis