とんかつ時々あんどーなつ

〜たとえ低空でも飛行していられるように〜

Angular で FormControl を扱うときの form.valid() と !form.invalid() は同等でない

はじめに

Angular でフォームを使う時に対象のフォームが valid か invalid かということを気にすることは日常茶飯事である。 これらは FormControl のステータスとして管理されているが、実は valid と invalid の他にあと 2 つの状態がある。

昔からある API なので、いまさら感はあるが少しハマったので備忘録として残す。

4 つの FormControlStatus とハマりどころ

まず 4 つの状態だが、ドキュメントの通り 'VALID' | 'INVALID' | 'PENDING' | 'DISABLED' である。 これだけ見ればシンプルである。

FormControlStatus • Angular 日本語版

アプリケーション内で対象のフォームが valid かどうかを調べるときには valid() を使うことが多いのではないだろうか。 valid() の返り値は boolean であるため、valid なら true が返る。しかし、ハマりどころとして false のときに invalid とは限らないという点がある。

上に書いたように状態は 4 つ存在する。valid() はあくまで form.status === 'VALID' かを返しているだけなので 'PENDING' や 'DISABLED' でも false になる。

あまり複雑なフォームでなければ問題になることは少ないと思うが、条件によって readonly の表示をするといった要件がある場合は 'DISABLED' の状態を取ったりもするので「valid であることを確かめたい」のか「invalid でないことを確かめたい」のか正しく把握する必要がある。

まとめ

form.valid()!form.invalid() は同等でないよ