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 参数传递的实际应用代码分析
Sep 13 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
Feb 26 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
Sep 17 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
嵌入式iframe子页面与父页面js通信的方法
Jan 20 Javascript
JS简单实现String转Date的方法
Mar 02 Javascript
jQuery+CSS实现简单切换菜单示例
Jul 27 Javascript
bootstrap中添加额外的图标实例代码
Feb 15 Javascript
vue、react等单页面项目应该这样子部署到服务器
Jan 03 Javascript
angular 服务随记小结
May 06 Javascript
JS+css3实现幻灯片轮播图
Aug 14 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
PHP JSON格式数据交互实例代码详解
2011/01/13 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
浅谈php提交form表单
2015/07/01 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
python访问类中docstring注释的实现方法
2015/05/04 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
Python Selenium参数配置方法解析
2020/01/19 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
团日活动总结模板
2014/06/25 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书