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 跨域和ajax 跨域问题小结
Jul 01 Javascript
Javascript中的Array数组对象详谈
Mar 03 Javascript
JS判断字符串包含的方法
May 05 Javascript
javascript匀速运动实现方法分析
Jan 08 Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 Javascript
Vue.js在使用中的一些注意知识点
Apr 29 Javascript
使用mint-ui开发项目的一些心得(分享)
Sep 07 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
Nov 14 jQuery
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
Jan 24 Javascript
浅谈vue权限管理实现及流程
Apr 23 Javascript
Vue 自适应高度表格的实现方法
May 13 Javascript
jquery插件实现搜索历史
Apr 24 jQuery
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
php遍历目录viewDir函数
2009/12/15 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
关于crontab的使用详解
2013/06/24 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
JS event使用方法详解
2008/04/28 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
微信小程序实现拼图小游戏
2020/10/22 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
浅谈python中的数字类型与处理工具
2017/08/02 Python
Python合并多个Excel数据的方法
2018/07/16 Python
python opencv如何实现图片绘制
2020/01/19 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
纪念建党演讲稿范文
2014/01/13 职场文书
技校个人求职信范文
2014/01/25 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
签证工作证明模板
2015/06/15 职场文书
实习证明模板
2015/06/16 职场文书
田径运动会通讯稿
2015/07/18 职场文书
高温慰问简报
2015/07/21 职场文书