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 相关文章推荐
js函数使用技巧之 setTimeout(function(){},0)
Feb 09 Javascript
js判断浏览器是否支持html5
Aug 17 Javascript
jQuery通过Ajax返回JSON数据
Apr 28 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
Feb 07 Javascript
canvas绘制环形进度条
Feb 23 Javascript
浅谈react+es6+webpack的基础配置
Aug 09 Javascript
Vue单文件组件基础模板小结
Aug 10 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
使用百度地图实现地图网格的示例
Feb 06 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
mysqli扩展无法在PHP7下升级问题的解决
2019/09/10 PHP
event.srcElement 用法笔记e.target
2009/12/18 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
详解Vue 动态添加模板的几种方法
2017/04/25 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
Django实现文件上传下载功能
2019/10/06 Python
如何使用python进行pdf文件分割
2019/11/11 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
Python用SSH连接到网络设备
2021/02/18 Python
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
六查六看剖析材料
2014/02/15 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
政风行风整改方案
2014/10/25 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL