【Angular】あなたのasync pipeは {{ 安全 | async }}ですか?
aysnc pipeとは
PromiseやObservableな非同期オブジェクトをそのままtemplateで表示できるようにしたpipeで
コンポーネントが破棄される時に自動でunsubscribeしてくれる便利なものです。
アンチパターン
oya.page.html
<div>
親の中で子コンポーネントを呼ぶ
<app-kodomo [name]="name$ | async">
私が子コンポーネントです。
</app-kodomo>
</div>
<div>
親の中で子コンポーネントを呼ぶ
<app-kodomo [name]="name$ | async">
私が子コンポーネントです。
</app-kodomo>
</div>
親コンポーネントでObservableな値を子コンポーネントに渡す
name$ = new BehaviorSubject('Hello');
子コンポーネント側でnullを考慮せずに処理している
@Input() name:string;
ngOnInit(){
this.name.slice(0, 1);
}
この場合、実行時エラーがでることがあります。
例として、子コンポーネントに渡すときの話をしましたが
以下のように親側でnullを考慮せずに表示しようとする場合も実行時エラーが発生することがあります。
<div>
{{ name$.slice(0, 1) | async}}
</div>
原因
AsyncPipeは購読したObservableが最初の値を流す前に、必ず一度 null を返すようにできているからです。
もとのObservableが Observable だったとしても、 AsyncPipeを通すと State | null となってしまいます。
対処方
- *ngIf や *ngForでnullをガードする
oya.html
<div *ngIf="name$ | async as name">
{{ name.slice(0, 1) | async}}
</div>
- 子コンポーネント側でnullを考慮した実装をする(これするくらいならAsyncPipe使わない方がいいです。)
参考資料
<div *ngIf="name$ | async as name">
{{ name.slice(0, 1) | async}}
</div>
lacolacoさん
https://blog.lacolaco.net/2020/02/async-pipe-initial-null-problem/
Angular質問箱
https://youtu.be/LVa68EI9NSw?t=990
Author And Source
この問題について(【Angular】あなたのasync pipeは {{ 安全 | async }}ですか?), 我々は、より多くの情報をここで見つけました https://qiita.com/tanakaKSK/items/68a10642c0561466a09c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .