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学习笔记(七) js函数介绍
Jun 19 Javascript
js函数获取html中className所在的内容并去除标签
Sep 08 Javascript
js操作输入框提示信息且响应鼠标事件
Mar 25 Javascript
用循环或if语句从json中取数据示例
Aug 18 Javascript
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
Dec 14 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
Sep 01 Javascript
JS简单实现表格排序功能示例
Dec 20 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
Jun 19 Javascript
详解离线安装npm包的几种方法
Nov 25 Javascript
JS中一些高效的魔法运算符总结
May 06 Javascript
js前端图片加载异常兜底方案
Jun 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
德生PL330测评
2021/03/02 无线电
php 设计模式之 工厂模式
2008/12/19 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
js 匿名调用实现代码
2009/06/19 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
vue实现评论列表功能
2019/10/25 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
python实现拼接图片
2020/03/23 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
参观接待方案
2014/03/17 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
教师节班会开场白
2015/06/01 职场文书
就业推荐表院系意见
2015/06/05 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL