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 处理 URL 的两个函数代码
Aug 13 Javascript
浅析javascript闭包 实例分析
Dec 25 Javascript
JS中字符串trim()使用示例
May 26 Javascript
针对初学者的jQuery入门指南
Aug 15 Javascript
js时间戳转为日期格式的方法
Dec 28 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
Sep 23 Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 Javascript
微信小程序 wx:for的使用实例详解
Apr 27 Javascript
微信小程序之发送短信倒计时功能
Aug 30 Javascript
JS中跳出循环的示例代码
Sep 14 Javascript
JS无限级导航菜单实现方法
Jan 05 Javascript
Vue插件从封装到发布的完整步骤记录
Feb 28 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
destoon复制新模块的方法
2014/06/21 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python实现批量下载图片的方法
2015/07/08 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Python扫描端口的实现
2021/01/25 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
SQL Server笔试题
2012/01/10 面试题
电信专业应届生自荐信
2013/09/28 职场文书
kfc实习自我鉴定
2013/12/14 职场文书
安全检查验收制度
2014/01/12 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
五一劳动节活动记录
2014/03/23 职场文书
解除同居协议书
2015/01/29 职场文书
思想道德自我评价2015
2015/03/09 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
asyncio异步编程之Task对象详解
2022/03/13 Python