javascript - Angular.js 缓存 $compiled 模板/ng-repeat 中指令的渲染性能

标签 javascript performance angularjs compilation angularjs-directive

我有一个呈现表格单元格的指令(看看我在这里编译它的方式,基本上是在 link fn Angular.js directive template using variable from parent/inherited scope 中使用 $compile ),现在这在两个 ng-repeat 中使用,一个用于行,一个用于列,所以它基本上是

<ng-repeat row in rows>
  <ng-repeat column in columns>
    <my-cell-directive />
  </ng-repeat>      
</ng-repeat>

它有 50 行和 8 列,它对(渲染)性能有相当大的影响(无论如何非常明显)。

所以我一直在寻找改进它的方法。首先,我试图摆脱列的内部重复,创建一个 my-cols-directive ,它在内部迭代列,找到它们的模板,创建一个字符串(里面有 8 列)然后编译它。这将编译量从 400 降低到 50。但是它在渲染上并没有真正显着的改进(确实有,但只有大约 15%)。

现在我的另一个想法是以某种方式将它减少到只有一次编译,基本上是在 ng-repeat 的第一次迭代中编译它,然后保存(缓存)编译结果以便指令然后使用它而不是编译它并再次,只需将绑定(bind)值替换为当前迭代中的值。

有可能吗?或者有什么其他方法可以提高渲染速度吗?

最佳答案

如果可能,您应该避免在链接函数中使用$compile。不过,您可以缓存 $compile 的部分结果。

使用编译对象的第二个参数 cloneAttachFn

directive('lol', function($compile){
  var compiled = $compile(template);
  return function(scope, element, attr){
    compiled(scope, function(clonedElement, scope){
      element.append(clonedElement);  
    };
  }
})

example

关于javascript - Angular.js 缓存 $compiled 模板/ng-repeat 中指令的渲染性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639396/

相关文章:

mysql - IN 和几个 OR 子句之间的 MySQL 有性能差异吗?

javascript - Controller 未调用。控制台上没有错误

javascript - 从服务 AngularJs 中修改 $scope

javascript - Chrome 中的并发 Ajax 请求

javascript - 在 JavaScript 命名空间中共享变量

javascript - 单击时显示文本

performance - 记录 ASP Web API 操作的持续时间

javascript - Javascript/Google Apps 脚本中二维数组的长度

c++ - 在 MATLAB 中计算文件行数的最快方法(Perl 比 C 快?)

javascript - 根据收到的模型值加载不同模板的指令