【问题标题】:AngularJS - How to stop ng-repeat when it reaches the last item on objectAngularJS - 如何在到达对象的最后一项时停止 ng-repeat
【发布时间】:2016-08-15 02:27:47
【问题描述】:

我 ng-repeat 一个巨大的对象,并且在 chrome 和 opera 上工作得很快。但在 Mozilla 和 IE 等浏览器上,它非常非常慢。我尝试使用分页并有所帮助,但我想在加载时显示所有项目而不是对它们进行分页。所以我想出了一个想法,如果有可能在执行对象的最后一项后停止 ng-repeat 监听该对象。

但它不应该删除它呈现的 html 元素。

如果对象被更改,它应该再次重新运行 ng-repeat 并将停止在最后一项。

据我对 ng-repeat 的了解,它会无限循环对象,因此这可能是 IE 和 Mozilla 在对象太大时加载它们速度慢的原因。

那么这可以停止 ng-repeat 吗?

【问题讨论】:

    标签: javascript html angularjs angularjs-ng-repeat


    【解决方案1】:

    如果您的集合根本没有改变,ngRepeat 不应该改变 DOM。您应该仔细分析,以确保问题是您认为的问题。

    在文档中 (https://docs.angularjs.org/api/ng/directive/ngRepeat),

    ngRepeat 使用 $watchCollection 来检测集合中的变化。当发生更改时,ngRepeat 会对 DOM 进行相应的更改:

    添加项目时,模板的新实例会添加到 DOM。

    当一个项目被移除时,它的模板实例就会从 DOM 中移除。

    当项目重新排序时,它们各自的模板在 DOM 中重新排序。

    无法防止这种情况发生,$watchCollection(我相信)必须遍历您的收藏以查看是否有任何内容被重新排序。

    看起来在仍然使用 ngRepeat 的同时“关闭”手表也是不可能的。

    如果您不想使用$watchCollection 作为检测更改的机制,您可能必须创建自己的脏检查/触发器,并自己生成 DOM。

    【讨论】:

    • 我明白了。那么如果是这种情况,如果浏览器是 mozilla 或 IE,我总是可以默认运行分页,如果是 chrome 或 Opera,则删除分页。谢谢!
    • @VoltaireJohnSecondesBiton 您是否真正描述了导致 mozilla 和 IE 速度下降的原因?集合的实际迭代(除非有成千上万的项目)不应造成太大的影响,除非您的集合不断变化
    • 它不会不断变化。但对象太大,Mozilla 和 IE 无法处理。它通常在加载时挂起,大约需要 2-3 分钟才能加载整个对象。但是在加载所有内容后它会挂起很多。对列表进行分页使其更快。
    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多