Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍


Posted in Javascript onDecember 13, 2016

Angular 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没有向当前控制器传递事件的方法,可以先向父(子)控制器传递事件,父(子)控制器监听到事件后反过来向子(父)控制器传递事件。

一句话总结:指令是angular的核心功能之一,用好了事半功倍,监听ng-repeat执行状态仅仅是它功能的冰山一角吧

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript 跳转代码集合
Dec 03 Javascript
bootstrap table 服务器端分页例子分享
Feb 10 Javascript
jquery.map()方法的使用详解
Jul 09 Javascript
Bootstrap 组件之按钮(二)
May 11 Javascript
深入理解jQuery之防止冒泡事件
May 24 Javascript
Google 爬虫如何抓取 JavaScript 的内容
Apr 07 Javascript
Angular2关于@angular/cli默认端口号配置的问题
Jul 15 Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
Jul 20 Javascript
JS二级菜单不同实现方法分析【4种方法】
Dec 21 Javascript
Vue动态生成表格的行和列
Jul 18 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
Jul 24 Javascript
node.js 和HTML5开发本地桌面应用程序
Dec 13 #Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 #Javascript
vue.js学习之递归组件
Dec 13 #Javascript
AngularJS过滤器filter用法总结
Dec 13 #Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 #Javascript
AngularJS服务service用法总结
Dec 13 #Javascript
Vue.js中用v-bind绑定class的注意事项
Dec 13 #Javascript
You might like
回帖脱衣服的图片实现代码
2014/02/15 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
PHP数组实例详解
2016/06/26 PHP
Js+XML 操作
2006/09/20 Javascript
javaScript call 函数的用法说明
2010/04/09 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
javascript 动态创建表格
2015/01/08 Javascript
js密码强度校验
2015/11/10 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
4个顶级开源JavaScript图表库
2018/09/29 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
浅谈Python中的模块
2020/06/10 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
甜美蛋糕店创业计划书
2014/01/30 职场文书
招商专员岗位职责
2014/02/08 职场文书
课程改革实施方案
2014/03/16 职场文书
会计专业求职信
2014/08/10 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
学生退学证明
2015/06/23 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
数据设计之权限的实现
2022/08/05 MySQL