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_11_constructor实现原理
Oct 18 Javascript
将文本输入框内容加入表中的js代码
Aug 18 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
May 19 Javascript
浅谈jquery选择器 :first与:first-child的区别
Nov 20 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
Dec 20 Javascript
Javascript中return的使用与闭包详解
Jan 11 Javascript
React如何利用相对于根目录进行引用组件详解
Oct 09 Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 Javascript
vue2 拖动排序 vuedraggable组件的实现
Aug 08 Javascript
微信小程序实现手势滑动效果
Aug 26 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
vue实现导航菜单和编辑文本的示例代码
Jul 04 Javascript
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
我的论坛源代码(四)
2006/10/09 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
Python常用类型转换实现代码实例
2020/07/28 Python
Python高并发和多线程有什么关系
2020/11/14 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
餐饮商业计划书范文
2014/04/29 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
Redis三种集群模式详解
2021/10/05 Redis
python 远程执行命令的详细代码
2022/02/15 Python