Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍_AngularJS

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执行状态仅仅是它功能的冰山一角吧

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索angular
ng-repeat遍历渲染
angularjs ng repeat、angularjs中ng repeat、angularjs的ng repeat、angularjs repeat、angularjs repeat嵌套,以便于您获取更多的相关知识。

时间: 2024-10-26 05:30:43

Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍_AngularJS的相关文章

thinkPHP 空模块和空操作、前置操作和后置操作 详细介绍(十四)

原文:thinkPHP 空模块和空操作.前置操作和后置操作 详细介绍(十四) 本章节:介绍 TP 空模块和空操作.前置操作和后置操作 详细介绍 一.空模块和空操作1.空操作function _empty($name){$this->show("$name 不存在 <a href='__APP__/Index/index'>返回首页</a>");}2.空模块(EmptyAction.class.php的文件)class EmptyAction extends

aspx页面事件执行顺序(详细版)[转]

from:http://www.cnblogs.com/jasononline/archive/2008/03/07/1095623.html 一.详细版 l 初始化 ² 当页面被提交请求第一个方法永远是构造函数.您可以在构造函数里面初始一些自定义属性或对象,不过这时候因为页面还没有被完全初始化所以多少会有些限制.特别地,您需要使用HttpContext对象.当前可以使用的对象包括QueryString, Form以及Cookies集合,还有Cache对象.注意:在构造函数里是不允许使用Sess

关于下载弹出下载页面后,操作完之后怎么刷新当前页面的问题

问题描述 关于下载弹出下载页面后,操作完之后怎么刷新当前页面的问题 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(zipFilePath, System.Text.Encoding.UTF8)); Response.ContentType = "application/octet-stream"; Response

iframe 调用远程问题如何实现B完全加载完远程页面后A再刷新

问题描述 iframe 调用远程问题如何实现B完全加载完远程页面后A再刷新 A页面<iframe 调用远程页面B,如何实现B完全加载完远程页面后A再刷新? 我原代码这样的, <script type="text/javascript"> document.write('<div id="gd_cn"><span>正在加载内容,请稍候--</span><img src="../images/ajax

javascript 广告后加载,加载完页面再加载广告_javascript技巧

先加载完页面再加载广告的原理: 网页打开的顺序都是按页面从上到下的顺序加载完成的,所以要想使广告不影响页面打开速度,就要等页面全部打开完成后,再加载JS代码.等页面加载完再加载广告其实就是将广告的 JS 代码放在页面的底部,等页面内容打开完成后再加载到广告代码,再用页面上预留好的的 DIV 输出广告. 使用方法: 1.将以下代码放置页面中想要放广告的地方 复制代码 代码如下: <div id="myads">载入中-</div> 2.将一下代码放置页面底部,也就

如何让页面加载完成后执行js

javascript 当页面dom模型加载完成后才执行javascript不能使用<body onload="">加上 defer 等于在页面完全在入后再执行,相当于 window.onload ,但应用上比 window.onload 更灵活 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/x

《精通 ASP.NET MVC 5》----2.3 渲染Web页面

2.3 渲染Web页面 前述示例的输出并不是HTML--只是一个字符串"Hello world".为了产生一个对浏览器请求进行响应的HTML,则需要一个视图(View). 2.3.1 创建并渲染视图 要做的第一件事是修改Index动作方法,如清单2-3所示. 清单2-3 在HomeController.cs文件中修改控制器,以渲染一个视图 using System; using System.Collections.Generic; using System.Linq; using S

指针-Android播放视频怎么进入页面后开始自动播放视频,需要在生命周期的哪个方法调用play方法

问题描述 Android播放视频怎么进入页面后开始自动播放视频,需要在生命周期的哪个方法调用play方法 为什么在onStart或者onResume中调用play方法会报空指针错误?求大神说下思路..... 解决方案 把该初始化的对象初始化完之后 解决方案二: 在ios中有一个页面即将出现的方法 ViewWillAppear方法 ios是在这个方法中调用的 看看安卓中是否有类似的方法 希望能帮到你 解决方案三: 在ios中有一个页面即将出现的方法 ViewWillAppear方法 ios是在这个

java执行完方法后怎么跳转到jsp

问题描述 java执行完方法后怎么跳转到jsp function submitForm1() { /* var id = document.getElementById("userId").value; if(id == ''){ alert("id不允许为空!"); return; } */ $.post("/mission/abc", $('#newForm').serialize(), function(data) {//"/us