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之一
Apr 27 Javascript
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
jquery对dom的操作常用方法整理
Jun 25 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
Nov 19 Javascript
通过Jquery的Ajax方法读取将table转换为Json
May 31 Javascript
javascript基于prototype实现类似OOP继承的方法
Dec 16 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
Nov 16 Javascript
ES6正则表达式的一些新功能总结
May 09 Javascript
jquery与js实现全选功能的区别
Jun 11 jQuery
webpack学习--webpack经典7分钟入门教程
Jun 28 Javascript
原生js实现简单的模态框示例
Sep 08 Javascript
vue给对象动态添加属性和值的实例
Sep 09 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
PHP 数组实例说明
2008/08/18 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
angular2中Http请求原理与用法详解
2018/01/11 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python使用psutil模块获取系统状态
2016/08/27 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
python中int与str互转方法
2018/07/02 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
Python猜数字算法题详解
2020/03/01 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
影视制作岗位职责
2013/12/04 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
餐厅筹备计划书
2014/04/25 职场文书
商场促销活动总结
2014/07/10 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书