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 图片上一张下一张链接效果代码
Mar 12 Javascript
JavaScript实现页面实时显示当前时间的简单实例
Jul 20 Javascript
用jquery仿做发微博功能示例
Apr 18 Javascript
javascript学习笔记(三)BOM和DOM详解
Sep 30 Javascript
jQuery中Form相关知识汇总
Jan 06 Javascript
jqTransform美化表单
Oct 10 Javascript
javascript cookie基础应用之记录用户名的方法
Sep 20 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
Sep 18 Javascript
Node.js模块全局安装路径配置方法
May 17 Javascript
使用apifm-wxapi快速开发小程序过程详解
Aug 05 Javascript
vue addRoutes路由动态加载操作
Aug 04 Javascript
Vue表单提交点击事件只允许点击一次的实例
Oct 23 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
简述jQuery Easyui一些用法
2017/08/01 jQuery
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
利用Python如何生成随机密码
2016/04/20 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
python3实现名片管理系统
2020/11/29 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
python性能测试工具locust的使用
2020/12/28 Python
高二生物教学反思
2014/01/27 职场文书
法学院方阵解说词
2014/01/29 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
护士岗位竞聘书
2015/09/15 职场文书
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python