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 相关文章推荐
FCK调用方法..
Dec 21 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
JS组件Form表单验证神器BootstrapValidator
Jan 26 Javascript
理解javascript异步编程
Jan 27 Javascript
基于JavaScript实现 网页切出 网站title变化代码
Apr 03 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
jQuery中的一些常见方法小结(推荐)
Jun 13 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
yarn与npm的命令行小结
Oct 20 Javascript
javascript中json基础知识详解
Jan 19 Javascript
Bootstrap风格的zTree右键菜单
Feb 17 Javascript
详解三种方式解决vue中v-html元素中标签样式
Nov 22 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
多广告投放代码 推荐
2006/11/13 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
Python datetime模块使用方法小结
2020/06/18 Python
python 实现端口扫描工具
2020/12/18 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
附答案的Java面试题
2012/11/19 面试题
进程的查看和调度分别使用什么命令
2013/12/14 面试题
反腐倡廉演讲稿
2014/05/22 职场文书
工程部文员岗位职责
2015/02/04 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
遗嘱格式范本
2015/08/07 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
Python基础 括号()[]{}的详解
2021/11/07 Python