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文本框(input textare)事件绑定方法教程
Apr 24 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
May 07 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
JavaScript中输出标签的方法
Aug 27 Javascript
原生JS实现LOADING效果
Mar 16 Javascript
javascript每日必学之条件分支
Feb 17 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
Apr 26 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
webpack多入口文件页面打包配置详解
Jan 09 Javascript
微信小程序实时聊天WebSocket
Jul 05 Javascript
js代码实现轮播图
May 04 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
关于文本留言本的分页代码
2006/10/09 PHP
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
javascript 对象比较实现代码
2009/04/27 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
js登录弹出层特效
2014/03/07 Javascript
JS中Location使用详解
2015/05/12 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
Python自定义主从分布式架构实例分析
2016/09/19 Python
python人民币小写转大写辅助工具
2018/06/20 Python
利用python修改json文件的value方法
2018/12/31 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
通过实例了解python property属性
2019/11/01 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
Python数据正态性检验实现过程
2020/04/18 Python
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
造价工程师个人求职信
2013/09/21 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
中秋节主持词
2014/04/02 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
查摆剖析材料范文
2014/09/30 职场文书
婚礼父母答谢词
2015/01/04 职场文书
教师个人自我评价
2015/03/04 职场文书
校运会新闻稿
2015/07/17 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL