我正在基于以下格式的数组在Angular模板中生成 SVG 图:
[{x: 0, y: 1}, {x: 1, y: 2}, ...]
-- 该数组将包含数千个点。
虽然我可以快速渲染<path>
具有数千个点的元素,但当我使用为每个点ng-repeat
创建一个元素时会出现不可接受的性能。<circle>
为了确保性能不是由于 SVG 性能,我复制了 Angular 生成的 SVG 输出并创建了一个静态 .html 文件,其中包含大约 5 个包含大约 10,000 个<circle>
元素的图形。静态文件几乎立即呈现。我还确认这不是我用于生成和缩放点的样板代码,因为没有<circle>
元素(只有 2 个<path>
元素)的性能非常出色。
我已将其缩小到DOM 注入机制或为每个元素创建一个具有自己的脏检查观察者的子范围ng-repeat
的事实。ng-repeat
根据一些详尽的研究,它似乎更有可能是后者。
这是生成图表的模板:
<svg width="1020" height="220">
<g class="series" transform="translate(10,10)">
<path class="series-fill" d="{{ series.path('fill') }}" stroke="none" fill="#ddd"></path>
<path class="series-path" d="{{ series.path('line') }}" stroke="#999" stroke-width="1" fill="none"></path>
<g class="series-points" stroke-width="1" stroke="#fff">
<circle ng-repeat="point in points" class="series-point" r="2" cx="{{ point.scaledX }}" cy="{{ point.scaledY }}"></circle>
</g>
</g>
</svg>
TL;DR,什么是最 Angular 或最推荐的使用ng-repeat
类似行为的方式,无需对每个元素进行脏检查,也无需使用观察者创建新的子作用域。显然分页/无限滚动不适用于此处。