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 相关文章推荐
用脚本调用样式的几种方法
Dec 09 Javascript
JQuery Dialog的内存泄露问题解决方法
Jun 18 Javascript
jquery图片延迟加载 前端开发技能必备系列
Jun 18 Javascript
JavaScript操作Cookie方法实例分析
May 27 Javascript
JQuery中DOM事件绑定用法详解
Jun 13 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
JavaScript实现替换字符串中最后一个字符的方法
Mar 07 Javascript
js图片放大镜效果实现方法详解
Oct 28 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 Javascript
Node.js学习之地址解析模块URL的使用详解
Sep 28 Javascript
AngularJS与后端php的数据交互方法
Aug 13 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 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结束标签的使用细节探讨及联想
2013/03/04 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
window.location的重写及判断location是否被重写
2014/09/04 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
浅谈JavaScript闭包
2019/04/09 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python Tornado框架的使用示例
2020/10/19 Python
如何用python写个模板引擎
2021/01/14 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
农行实习自我鉴定
2013/09/22 职场文书
档案管理员岗位职责
2013/12/01 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
建议书标准格式
2014/03/12 职场文书
学前教育专业求职信
2014/09/02 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书