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数组
May 11 Javascript
jquery实现保存已选用户
Jul 21 Javascript
理解javascript中的回调函数(callback)
Sep 02 Javascript
浅谈JavaScript中的String对象常用方法
Feb 25 Javascript
TypeOf这些知识点你了解吗
Feb 21 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
Nov 09 Javascript
js实现tab选项卡切换功能
Jan 13 Javascript
利用Vue.js实现求职在线之职位查询功能
Jul 03 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
Dec 03 Javascript
JavaScript实现星级评价效果
May 17 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 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
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
php递归函数怎么用才有效
2018/02/24 PHP
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
vue登录路由验证的实现
2017/12/13 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
NumPy排序的实现
2020/01/21 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
新闻学专业个人求职信写作
2014/02/04 职场文书
2014年元旦活动方案
2014/02/15 职场文书
2014全国两会心得体会
2014/03/17 职场文书
优秀员工评优方案
2014/06/13 职场文书
委托证明书
2014/09/17 职场文书
涨价通知怎么写
2015/04/23 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫