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 相关文章推荐
Javascript中的常见排序算法
Mar 27 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 Javascript
js中的replace方法使用介绍
Oct 28 Javascript
jQuery动画效果animate和scrollTop结合使用实例
Apr 02 Javascript
css如何让浮动元素水平居中
Aug 07 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
详解Bootstrap插件
Apr 25 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
JS得到当前时间的方法示例
Mar 24 Javascript
javaScript动态添加Li元素的实例
Feb 24 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
Mar 02 Javascript
深入了解JS之作用域和闭包
Jun 16 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP STRING 陷阱原理说明
2010/07/24 PHP
javascript 进度条 实现代码
2009/07/30 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
Python模拟登陆实现代码
2017/06/14 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
python实现集中式的病毒扫描功能详解
2019/07/09 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
专业求职信撰写要诀
2014/02/18 职场文书
日语专业求职信
2014/07/04 职场文书
世界读书日的活动方案
2014/08/20 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
法制教育演讲稿
2014/09/10 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫