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 查找新建元素代码
Jul 06 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
Dec 28 Javascript
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
jQuery使用之设置元素样式用法实例
Jan 19 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
Mar 24 Javascript
JQuery插件Marquee.js实现无缝滚动效果
Apr 26 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
vue-router路由与页面间导航实例解析
Nov 07 Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 Javascript
vue配置nprogress实现页面顶部进度条
Sep 21 Javascript
js实现二级联动简单实例
Jan 11 Javascript
vue 如何从单页应用改造成多页应用
Oct 23 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(2)
2006/10/09 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
JObj预览一个JS的框架
2008/03/13 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
JS中使用media实现响应式布局
2017/08/04 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
Python2.7读取PDF文件的方法示例
2017/07/13 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
对python生成业务报表的实例详解
2019/02/03 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
Python绘制数码晶体管日期
2021/02/19 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
幼儿园实习生辞职信
2014/01/20 职场文书
招股说明书范本
2014/05/06 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js