javascript - 如何在 ng-repeat 中使指令渲染更快

标签 javascript angularjs

我有很多项目要加载。

所以我放弃了ng-repeat。在此之下,我使用一个指令。因此指令应该加载到每个项目上。

这里,完成ng-repeat中的所有项目后加载基本 View 需要一些时间。

所以,我需要逐个查看(渲染)单个项目。实际上, View 不应该等待完整的 ng-repeat

<div ng-repeat="site in siteList>
<stock-chart graph-site="site" graph-params="graphParams" ></stock-chart>
</div>

在这里,我有 graphParamsgraphSite 的观察者。

我们如何为此编写代码?

最佳答案

没有办法加快渲染速度,但您可以采取一些技巧来提高 UI 的响应速度:

  • 使用自定义过滤器来确定用户何时位于 View 底部 并从原始数组中渲染更多值。
  • 使用“track by”表达式来避免额外渲染。

这是一个为您提供的实例:

https://plnkr.co/edit/onSjuQL8aB3iXGBamP28?p=preview

跟踪方式:

<div ng-repeat="site in siteList | scrollFilter:this:100 track by site.id">

过滤器:

app.filter('scrollFilter', function() {
  var bottomScrolledCount = 1,
      scope = null;
  window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
      if (scope) {
        scope.$apply(function() {
          bottomScrolledCount++;
        })
      }
    }
  };
  return function(values, fscope, length) {
    scope = fscope;
    var filterResult = [];
    for (i = 0, len = Math.min(values.length, length * bottomScrolledCount); i < len; i++) {
      filterResult.push(values[i]);
    }
    console.log(filterResult.length);
    return filterResult
  }
})

核心思想是将渲染项限制传递给过滤器,并使用 window.onscroll 事件检查页面是否滚动到底部。由于按表达式进行跟踪,因此不会花费更多时间来渲染旧项目。只有新的才会添加到 View 中。

此外,您需要将范围传递给过滤器才能使用 $apply 方法。

关于javascript - 如何在 ng-repeat 中使指令渲染更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40236415/

相关文章:

javascript - 如何在VML中访问拉斐尔填充图像

javascript - 如何防止用户按退格键/后退箭头

javascript - 用于复选框上 ng-indeterminate 属性的 AngularJS 自定义指令

javascript - 使用迭代器 JavaScript 提取整个数组值(数组的克隆副本)

javascript - 将焦点设置到 iframe 中的 jQuery 终端

javascript - 如何通过单击另一个图表的元素来打开 Kibana 图表

javascript - post 请求总是在最后执行 angularjs 函数(不按顺序执行)

javascript - 独特不适用于 angular.js

javascript - 如何获得事件的可观察对象?

javascript - 未为类型定义 hyperledger composer 命名空间