在模板中调用函数会导致 Angular 2 出现性能问题吗?

Does calling functions in templates cause performance issues in Angular2+?

我还在习惯 Angular 的变更检测实现,我不清楚在模板中调用函数是否会导致性能问题。

例如,这样做是不是更糟:

<mat-tab-group>
  <mat-tab label="First"> {{ getFirstTab() }} </mat-tab>
  <mat-tab label="Second"> {{ getSecondTab() }} </mat-tab>
</mat-tab-group>

比:

<mat-tab-group>
  <mat-tab label="First"> {{ firstTabContent }}</mat-tab>
  <mat-tab label="Second"> {{ secondTabContent }}</mat-tab>
</mat-tab-group>

怎么样:

<button *ngIf="shouldShowButton()" .... >   

确实如此:当您使用变量时,更改检测会监视该变量,并且仅当该变量更改时才会触发更新机制。

当您使用更复杂的东西(例如方法调用)时,除了在每个更改检测周期和更新时评估表达式之外别无他法。

因此,您始终可以保证使用变量而不是函数调用具有相同或(好得多)更好的性能。这完全取决于与变化检测周期数相比,您的变量变化是否很大。

您可以在 this blog post to dive in the change detection mechanism internals, and here a discussion with examples 中找到关于您的具体问题的很好的参考。

在@enno.void评论后编辑:

在许多情况下,您可以使用自定义管道代替,示例已给出 on this page

第一种方法是可行的,只要您正在调用字符串...并且该函数应该像这样位于 mat-tab 中:

<mat-tab-group>
  <mat-tab label="First" {{ getFirstTab() }}> </mat-tab>
  <mat-tab label="Second" {{ getSecondTab() }}> </mat-tab>
</mat-tab-group> 

我认为最后一个根本行不通...调用 *ngIf 中的函数会出错

<button *ngIf="shouldShowButton()" .... >