Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法


Posted in Javascript onDecember 31, 2016

前言

在用AngularJS期间, 经常用到ng-repeat, 业务中有时需要在异步获取数据并用ng-repeat遍历渲染完页面后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己动手写。有经验的同学都应该知道,在ng-repeat模板实例内部会暴露出一些特殊属性$index/$first/$middle/$last/$odd/$even$index会随着每次遍历(从0开始)递增,当遍历到最后一个时,$last的值为true,so,通过判断$last的值来监听ng-repeat的执行状态,怎么在遍历过程中拿到$last的值:自定义指令

小实例,我只写了最重要的部分

//要循环的数据
$scope.data = [
 {
  str: 'a'
 },
 {
  str: 'b'
 },
 {
  str: 'c'
 }
]
//自定义指令repeatFinish
app.directive('repeatFinish',function(){
 return {
  link: function(scope,element,attr){
   console.log(scope.$index)
   if(scope.$last == true){
    console.log('ng-repeat执行完毕')
   }
  }
 }
})
<div id="box">
 <span ng-repeat="item in data" repeat-finish>{{item.str}}</span>
</div>

打开控制台,会打印出0,1,2,当$index = 2点时候,$last值为true,ng-repeat渲染完毕

so easy!

当然指令最好是能够复用,在这个指令内写具体的业务逻辑不利于复用,可以通过给指令指定一个处理函数renderFinish

<div id="box">
 <span ng-repeat="item in data" repeat-finish="renderFinish()">{{item.str}}</span>
</div>

再通过指令的attr参数获取这个处理函数

app.directive('repeatFinish',function(){
 return {
  link: function(scope,element,attr){
   console.log(scope.$index)
   if(scope.$last == true){
    console.log('ng-repeat执行完毕')
    scope.$eval( attr.repeatFinish )
   }
  }
 }
})
//controller里对应的处理函数
$scope.renderFinish = function(){
 console.log('渲染完之后的操作')
}

attr获取到的属性只是一个字符串表达式,$scope.$eval方法是专门执行AngularJS表达式的,通过它处理函数得以执行,这样,指令用在不同的地方,可传递不同的处理函数。

有些业务比较复杂,可能ng-repeat渲染完成之后,需要执行多个操作并且这多个操作有多个前端完成,需要用到angular的事件,在repeatFinish指令的link函数内触发一个事件,各位前端同学监听该事件完成各自的操作

app.directive('repeatFinish',function(){
 return {
  link: function(scope,element,attr){
   console.log(scope.$index)
   if(scope.$last == true){
    console.log('ng-repeat执行完毕')
    //向父控制器传递事件
    scope.$emit('to-parent');
    //向子控制器传递事件
    scope.$broadcast('to-child');
   }
  }
 }
})
//父控制器中监听事件
$scope.$on('to-parent',function(){
 //父控制器执行操作
})

//子控制器中监听事件
$scope.$on('to-child',function(){
 //子控制器执行操作
})

如何在当前控制器下监听到该事件呢?angular没有向当前控制器传递事件的方法,可以先向父(子)控制器传递事件,父(子)控制器监听到事件后反过来向子(父)控制器传递事件。

补充:IE8可以直接在元素上用指令ng-if="$last && renderFinish()" ,当然IE8+也可以这样用

总结

以上就是利用angular指令监听ng-repeat渲染完成后执行脚本的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
使用户点击后退按钮使效三行代码
Jul 07 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
Mar 24 Javascript
js substr、substring和slice使用说明小记
Sep 15 Javascript
javascript框架设计读书笔记之数组的扩展与修复
Dec 02 Javascript
node.js中的fs.link方法使用说明
Dec 15 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
遍历json获得数据的几种方法小结
Jan 21 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
Oct 24 Javascript
详解react、redux、react-redux之间的关系
Apr 11 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
Jun 04 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 Javascript
JS实现页面鼠标点击出现图片特效
Aug 19 Javascript
angularjs中ng-attr的用法详解
Dec 31 #Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
Dec 31 #Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 #Javascript
Javascript 实现全屏滚动实例代码
Dec 31 #Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 #Javascript
javascript 闭包详解及简单实例应用
Dec 31 #Javascript
深入理解Angularjs中的$resource服务
Dec 31 #Javascript
You might like
一个改进的UBB类
2006/10/09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
JS backgroundImage控制
2009/05/19 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
JS实现横向轮播图(中级版)
2020/01/18 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
Python遍历目录的4种方法实例介绍
2015/04/13 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
局域网标准
2016/09/10 面试题
管理部部长岗位职责
2013/12/05 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
佛光寺导游词
2015/02/10 职场文书
小学运动会宣传稿
2015/07/23 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS