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 相关文章推荐
jquery1.83 之前所有与异步列队相关的模块详细介绍
Nov 13 Javascript
javascript中判断一个值是否在数组中并没有直接使用
Dec 17 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
JavaScript判断浏览器类型的方法
Feb 10 Javascript
JavaScript中的toUTCString()方法使用详解
Jun 12 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
May 12 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
May 07 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
Jul 09 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
Jul 12 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 Javascript
DWR内存兼容及无法调用问题解决方案
Oct 16 Javascript
js实现网页随机验证码
Oct 19 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
python 保存float类型的小数的位数方法
2018/10/17 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python获取栅格点和面值的实现
2020/03/10 Python
Python Selenium库的基本使用教程
2021/01/04 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
生物科学专业职业规划书范文
2014/02/11 职场文书
工作经验交流材料
2014/12/30 职场文书
会议主持词开场白
2015/05/28 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python