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.pagination.js 无刷新分页实现步骤分享
May 23 Javascript
js jq 单击和双击区分示例介绍
Nov 05 Javascript
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
JQuery中DOM实现事件移除的方法
Jun 13 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
Mar 14 Javascript
vue中路由验证和相应拦截的使用详解
Dec 13 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
Dec 20 Javascript
基于React Native 0.52实现轮播图效果
Aug 25 Javascript
Vue中使用matomo进行访问流量统计的实现
Nov 05 Javascript
vue router返回到指定的路由的场景分析
Nov 10 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 判断变量类型实现代码
2009/10/23 PHP
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
php设计模式之委托模式
2016/02/13 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
javascript工具库代码
2012/03/29 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
Python 第一步 hello world
2009/09/25 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
关于python 跨域处理方式详解
2020/03/28 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
运动会入场词100字
2014/02/06 职场文书
高三霸气励志标语
2014/06/24 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP