跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何确认ng-repeat渲染完成

这次给大家带来如何确认ng-repeat渲染完成,确认ng-repeat渲染完成的 注意事项 有哪些,下面就是实战案例,一起来看一下。 某个项目,我的网页中有一个列表
元素,样式如下: 实际上它是通过
Angular
的ng-
repeat
形成的,
html
中的代码是:
  • {{ list.name }}
  • 图中下方的新建清单
    button
    ,点击之后就往
    lists
    数组中
    push
    了一个新的
    list
    对象,此时页面会自动渲染,也对应增加一个
  • ,如下: 注意
    MyList1
    一直是
    active
    状态的(
    class="active"
    ),我的需求是 新增
    list
    后,把新增的
    list
    设置为
    active
    ,即在新增后就变成下面这种样式: 刚开始我尝试在
    button
    对应的函数中,往
    lists
    数组中
    push
    了新的
    list
    对象后,使用
    document.getElementById
    获取到新增的
  • 对象,然后为其添加一个
    class="active"
    ,结果发现获取到的
    DOM
    对象为
    null
    ,经过 搜索 发现原因是:往
    lists
    数组
    push
    对象后,数组发生改变,所有的
  • 都会重新渲染,在
    push
    完成之后马上去找新增的
    DOM
    对象,
    DOM
    还没渲染好,因此是获取不到的。解法是:使用
    AngularJS
    的指令去监听
    ng-repeat
    是否渲染完成,在渲染完成后,再去取新增的
  • 对象,这个网上有很多相关的内容了,代码如下:
    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"
    表示指令放在
    DOM
    的
    class
    中(驼峰形式,即
    class="repeat-finish"
    ),
    scope.$last === true
    表示已经渲染到了最后一个对象,此时执行
    change_list
    函数(定义在 控制器 中,功能是把当前
    active
    的对象取消
    active
    ,然后设置传入的
    DOM
    对象为
    active
    ),
    element[0]
    可以直接取到当前渲染的
    DOM
    元素。注意我使用了
    $timeout
    ,
    10ms
    后执行
    change_list
    ,我发现直接使用
    change_list
    还是会找不到
    DOM
    ,原因不明,期待大神解答。 相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章! 推荐阅读: Vue.js+Flask来构建单页的App(附代码) 不使用vue代码规范检测方法总结

    相关文章