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 相关文章推荐
json跟xml的对比分析
Jun 10 Javascript
javascript 当前日期加(天、周、月、年)
Aug 09 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
Nov 17 Javascript
理解javascript定时器中的setTimeout与setInterval
Feb 23 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
Mar 25 Javascript
js从外部获取图片的实现方法
Aug 05 Javascript
Vue组件开发技巧总结
Mar 04 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 Javascript
mpvue实现微信小程序快递单号查询代码
Apr 03 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
Aug 06 Javascript
vue使用element-ui按需引入
May 20 Vue.js
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 删除无限级目录与文件代码共享
2008/11/22 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
HTML DOM的nodeType值介绍
2011/03/31 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
Python实现读取并保存文件的类
2017/05/11 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
Python中Selenium模块的使用详解
2020/10/09 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
农民入党思想汇报
2014/01/03 职场文书
特此通知格式
2015/04/27 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书