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执行状态仅仅是它功能的冰山一角吧
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法,包括了Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法的使用技巧和注意事项,需要的朋友参考一下 前言 在用AngularJS期间, 经常用到ng-repeat, 业务中有时需要在异步获取数据并用ng-repeat遍历渲染完页面后执行某个操作,angular本身并没有提供监听ng-repe
web-frame 模块可自定义渲染当前网页 进程: 渲染进程 例如放大当前页至 200%. 1 const {webFrame} = require('electron') 2 webFrame.setZoomFactor(2) Copied! 方法 webFrame.setZoomFactor(factor) 用途:设置页面的缩放系数 factor Number - 缩放系数 注意:缩放系数
问题内容: 在下面的代码中,我试图一次性进行多个(大约10个)HTTP请求和RSS解析。 我在需要访问和解析结果的URI数组上使用标准构造。 码: 我了解一次调用函数时,应该使用回调。但是,在此示例中,我唯一想到使用回调的方法是调用一个函数,该函数对被调用的次数进行计数,并且仅在被调用的次数与看起来很hacky 的次数相同时才继续。 所以我的问题是, 在node.js中处理这种情况的最佳方法 是
问题内容: 我在DOM中有一个Angular模板。当我的控制器从服务中获取新数据时,它将更新$ scope中的模型,然后重新呈现模板。到目前为止一切都很好。 问题是,在模板重新渲染并且在DOM中(在本例中为jQuery插件)之后,我还需要做一些额外的工作。 似乎应该有一个事件要听,例如AfterRender,但我找不到任何此类事件。也许一条指令可以走,但它似乎还为时过早。 这是一个概述我的问题的j
本文向大家介绍python操作xml文件详细介绍,包括了python操作xml文件详细介绍的使用技巧和注意事项,需要的朋友参考一下 关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码。这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件。 一、什么是xml? xml即可扩展标记语言,它可以用来标记数据、定义数据类
问题内容: 在遍历数据后,我遇到一些有关DOM操作的问题。 我们有一个与数据绑定并且可以正常工作的jQuery滑块插件,但是当使用时,我们必须将其初始化包装起来以使其起作用—现在甚至不起作用。 我认为使用是不可靠的,这将导致错误的修复。在jQuery中,我可以使用-这很可靠,但是使用似乎也不起作用。 调用了Slider指令,但由于没有将图像加载到DOM中而无法获得滑块中图像的高度-导致滑块的计算高