AngularJS监听ng-repeat渲染完成的方法


Posted in Javascript onMarch 20, 2018

某个项目,我的网页中有一个列表<ul>元素,样式如下:

AngularJS监听ng-repeat渲染完成的方法

实际上它是通过Angular的ng-repeat形成的,html中的代码是:

<li ng-repeat="for list in lists()" id="{{ list.id }}">{{ list.name }}</li>

图中下方的新建清单button,点击之后就往lists数组中push了一个新的list对象,此时页面会自动渲染,也对应增加一个<li>,如下:

AngularJS监听ng-repeat渲染完成的方法

注意MyList1一直是active状态的(class="active"),我的需求是新增list后,把新增的list设置为active,即在新增后就变成下面这种样式:

AngularJS监听ng-repeat渲染完成的方法

刚开始我尝试在button对应的函数中,往lists数组中push了新的list对象后,使用document.getElementById获取到新增的<li>对象,然后为其添加一个class="active",结果发现获取到的DOM对象为null,经过搜索发现原因是:往lists数组push对象后,数组发生改变,所有的<li>都会重新渲染,在push完成之后马上去找新增的DOM对象,DOM还没渲染好,因此是获取不到的。解法是:使用AngularJS的指令去监听ng-repeat是否渲染完成,在渲染完成后,再去取新增的<li>对象,这个网上有很多相关的内容了,代码如下:

myapp.directive('repeatFinish', function ($timeout) {
  return {
    restrict: "C",
    link: function (scope, element, attr) {
      if(scope.$last === true){
        $timeout(function () {
          scope.change_list(element[0]);
        }, 10);
      }
    }
  }
});

上述代码建立了一个名为repeatFinish的指令,restrict: "C"表示指令放在DOMclass中(驼峰形式,即class="repeat-finish"),scope.$last === true表示已经渲染到了最后一个对象,此时执行change_list函数(定义在控制器中,功能是把当前active的对象取消active,然后设置传入的DOM对象为active),element[0]可以直接取到当前渲染的DOM元素。注意我使用了$timeout10ms后执行change_list,我发现直接使用change_list还是会找不到DOM,原因不明,期待大神解答。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript数组去掉重复
May 12 Javascript
js如何获取file控件的完整路径具体实现代码
May 15 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
Aug 14 Javascript
搭建Bootstrap离线文档的方法
Dec 02 Javascript
Vue通过input筛选数据
Oct 26 Javascript
jQuery实现的两种简单弹窗效果示例
Apr 18 jQuery
深入浅析AngularJs模版与v-bind
Jul 06 Javascript
微信小程序实现底部导航
Nov 05 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 Javascript
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 #Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 #Javascript
解决vue-router中的query动态传参问题
Mar 20 #Javascript
vue数据传递--我有特殊的实现技巧
Mar 20 #Javascript
手写Node静态资源服务器的实现方法
Mar 20 #Javascript
JS 实现缓存算法的示例(FIFO/LRU)
Mar 20 #Javascript
react-native封装插件swiper的使用方法
Mar 20 #Javascript
You might like
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
一个简单计数器的源代码
2006/10/09 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
javascript打印输出json实例
2013/11/11 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
自己动手写的javascript前端等待控件
2015/10/30 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
详解vue渲染函数render的使用
2017/12/12 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
python 装饰器的基本使用
2021/01/13 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
美国性感女装网站:bebe
2017/03/04 全球购物
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
大学生的创业计划书就该这么写
2014/01/30 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
小学生评语集锦
2014/04/18 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
红色革命电影观后感
2015/06/18 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书