在 Angular 组件模板中使用吸气剂?

Using getters in Angular Component Templates?

假设我们有一个 getter 定义如下:

  get sku() {
    return this.form.get('sku').value
  }

我们这样使用它:

    <mat-hint *ngIf="!sku">Example sku123</mat-hint>

从Angular变化检测性能的角度来看,是否有更好的方法来做到这一点?

我们可以使用 Observable。我认为是这样的(粗略):

sku$ = this.form.get('sku').valueChanges().pipe(untilDestroyed(this))
<mat-hint *ngIf="!(sku|async)">Example sku123</mat-hint>

一个比另一个好吗?

IIUC getter 会在检测到变化时被调用,但是如果我们使用 ChangeDetectionStrategy.OnPushObservable 那么只会在表单更新时收到通知?

使用 ChangeDetectionStrategy.OnPush 将不会在 *ngIf 视图中将更改应用到您的 sku,因为自动更改检测现在已停用。只有事件会被触发而不改变视图。因此,您必须使用

显式调用它

constructor(private cdRef: ChangeDetectorRef) {}

this.form.valueChanges
    .subscribe(() => {
      this.cdRef.markForCheck();
    });
  }
<mat-hint *ngIf="!sku">Example sku123</mat-hint>

注意:使用 ChangeDetectionStrategy.OnPush 会提高性能,因为它只运行一次循环。但是当涉及到反应形式时会变得复杂。而且父组件中使用 ChangeDetectionStrategy.OnPush 的所有子组件都将被继承,如果需要,您将不得不手动调用它们。

Getter 对性能来说很好,除非函数很昂贵,因为它会在每个循环中调用。在这种情况下,首选管道,因为结果会被缓存。