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 相关文章推荐
jquery 与NVelocity 产生冲突的解决方法
Jun 13 Javascript
Ajax同步与异步传输的示例代码
Nov 21 Javascript
JQuery中clone方法复制节点
May 18 Javascript
Json按某个键的值进行排序
Dec 22 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
Dec 28 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
Jan 27 Javascript
3种vue组件的书写形式
Nov 29 Javascript
vue移动端实现下拉刷新
Apr 22 Javascript
详解Vue.js中.native修饰符
Apr 24 Javascript
Javascript实现异步编程的过程
Jun 18 Javascript
vue-cli3脚手架的配置及使用教程
Aug 28 Javascript
angularjs http与后台交互的实现示例
Dec 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加密解密的代码
2007/07/16 PHP
php抽象类使用要点与注意事项分析
2015/02/09 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
JS字符串处理实例代码
2013/08/05 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
Python脚本实现代码行数统计代码分享
2015/03/10 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
《手指教学》反思
2014/02/14 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
论文评语大全
2014/04/29 职场文书
学生期末评语大全
2014/04/30 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
2015年共青团工作总结
2015/05/15 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
Golang gRPC HTTP协议转换示例
2022/06/16 Golang