これはかなり独断的な答えです。
このような関数の使用は完全に許容されます。これにより、テンプレートがより明確になり、大きなオーバーヘッドは発生しません。JBが前に言ったように、それは同様にユニットテストのためのはるかに良いベースを設定します。
また、テンプレート内にある式はすべて、変更検出メカニズムによって関数として評価されるので、テンプレートまたはコンポーネントロジック内にあるかどうかは関係ありません。
関数内のロジックを最小限に抑えるだけです。あなたは、このような機能を持っている可能性のあるパフォーマンスへの影響についてしかし、警戒している場合、私は強くあなたの置くことをアドバイスChangeDetectionStrategyしOnPushとにかくベストプラクティスと考えています、。これにより、関数がサイクルごとに呼び出されるのではなく、Input変更、テンプレート内で何らかのイベントが発生した場合などにのみ呼び出されます。
(他の理由がわからないため、etcを使用)。
個人的にも、Observablesパターンを使用する方がいいと思います。asyncパイプを使用すると、新しい値が出力されたときにのみ、テンプレートが再評価されます。
userIsAuthorized$ = combineLatest([
this.user$,
this.isAuthorized$
]).pipe(
map(([ user, authorized ]) => !!user && !!user.name && authorized),
shareReplay({ refCount: true, bufferSize: 1 })
);
その後、次のようにテンプレートで使用できます。
<ng-template *ngIf="userIsAuthorized$ | async">
...
</ng-template>
さらに別のオプションはngOnChanges、コンポーネントへのすべての依存変数が入力であり、特定のテンプレート変数を計算するために多くのロジックが実行されている場合に使用することです(これは示したケースではありません)。
export class UserComponent implements ngOnChanges {
userIsAuthorized: boolean = false;
@Input()
user?: any;
@Input()
isAuthorized?: boolean;
ngOnChanges(changes: SimpleChanges): void {
if (changes.user || changes.isAuthorized) {
this.userIsAuthorized = this.userCheck();
}
}
userCheck(): boolean {
return this.user && this.user.name && this.isAuthorized || false;
}
}
次のようにテンプレートで使用できます。
<ng-template *ngIf="userIsAuthorized">
...
</ng-template>