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 相关文章推荐
Prototype使用指南之array.js
Jan 10 Javascript
ko knockoutjs动态属性绑定技巧应用
Nov 14 Javascript
javascript获取所有同类checkbox选项(实例代码)
Nov 07 Javascript
js设置组合快捷键/tabindex功能的方法
Nov 21 Javascript
jquery prop的使用介绍及与attr的区别
Dec 19 Javascript
jQuery实现自动调用和触发某个事件的方法
Nov 18 Javascript
基于jQuery实现表格的排序
Dec 02 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
Jul 26 Javascript
小程序实现左右来回滚动字幕效果
Dec 28 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
javascript中正则表达式语法详解
Aug 07 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
Oct 21 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 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
php pdo操作数据库示例
2017/03/10 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
详解Python中的__new__()方法的使用
2015/04/09 Python
使用python实现接口的方法
2017/07/07 Python
Django中间件实现拦截器的方法
2018/06/01 Python
python 多线程串行和并行的实例
2019/02/22 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
python3正则模块re的使用方法详解
2020/02/11 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
员工培训心得体会
2013/12/30 职场文书
应用外语系自荐信
2014/06/26 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
css3应用示例:新增的选择器
2022/03/16 HTML / CSS