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 相关文章推荐
使用jquery为table动态添加行的实现代码
Mar 30 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
Mar 20 Javascript
js动态设置鼠标事件示例代码
Oct 30 Javascript
JavaScript控制按钮可用或不可用的方法
Apr 03 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
Dec 11 Javascript
AngularJS包括详解及示例代码
Aug 17 Javascript
Bootstrap提示框效果的实例代码
Jul 12 Javascript
Vue Router去掉url中默认的锚点#
Aug 01 Javascript
JavaScript引用类型Date常见用法实例分析
Aug 08 Javascript
vue按需加载实例详解
Sep 06 Javascript
微信小程序订阅消息(java后端实现)开发
Jun 01 Javascript
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
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
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
JavaScript 给汉字排序实例代码
2008/06/28 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
python实现备份目录的方法
2015/08/03 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
员工薪酬福利制度
2014/01/17 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
上班看电影检讨书
2014/02/12 职场文书
电子专业自荐信
2014/07/01 职场文书
导游词格式
2015/02/13 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python