模板内的函数被多次调用(Angular JS)



今天我必须修复由此代码引起的性能问题:注意模板内调用的更新统计信息

<script type="text/ng-template" id="entityGrouper">
<section>
<div>
<ul ng-click="hideEntityBox = !hideEntityBox">
<li>
{{ entityNode.name }}
</li>
<li ng-repeat="breadcrumbItem in entityNode.breadcrumb">
{{ breadcrumbItem }}
</li>
</ul>
{{ updateStats(entityNode) }}
<span ng-include="'/mypath/views/resume.html'"></span>
</div>
<div>
<div ng-repeat="entityNode in entityNode.group" ng-include="'entityGrouper'"></div>
<div ng-repeat="entity in entityNode.group" ng-include="'entityBox'"></div>
</section>
</script>

模板使用:

<div ng-repeat="entityNode in entityNode.group" ng-include="'entityGrouper'"></div>

调试完这段代码后,我发现这个函数被调用的时间比数组大小多得多(我的数组有 4 个对象,该函数被调用了 100 多次),甚至鼠标悬停也调用了这个函数。我通过在模板中放置一个 ng-init 来解决这个问题,现在它工作正常,但我不明白为什么这个函数被调用了这么多次。双向数据绑定有什么问题吗?

对于此类方案,通常建议使用$watch。由于您正在绑定一个函数{{updateStats()}},它将在每个摘要周期执行。

因此,在代码中,每当调用摘要循环时,它也会调用该函数。在 Angular 中,消化循环经常在内部调用。

发生这种情况不是因为双向数据绑定(它适用于表单输入),而是因为角度变化检测。Angular 会定期检查绑定到模板的任何值是否已更改,如果是,则更新其在视图中的值。通常,它由用户生成的事件触发。为了检查updateStats(entityNode)的值是否更改,Angular 会对其进行评估,从而导致性能下降。

若要解决此问题,可以使用前面提到的一次性绑定updateStats(entityNode)如果结果设置一次并且将来永远不会更改。我想,这是你的情况,你已经把评估移到了ng-init.对于随时间更新的值,最好在entityNode中创建一个单独的属性,例如 entityNode.stats ,将其显示在模板中,并仅在必要时在控制器或服务中运行updateStats(entityNode)。通过这样做,您将防止在每个摘要周期上运行updateStats(entityNode)(您已经了解了该频率),从而提高了应用程序的性能。

您所看到的是摘要循环的结果。

添加::将调用函数一次/一次性绑定。

{{ ::updateStats(entityNode) }}

相关内容

  • 没有找到相关文章

最新更新