はまったりひらめいたり…とか…

Angularや.NETやAzureやその他色々。

「簡単な」入力状態復帰機能をAngularのReactiveFormsで実装した話

はじめに

Angularは下記のバージョンでお送りします。

@angular/cli: 7.3.9

なにがしたかったか

  • 認証にAzure ADを使用している関係で、定期的に(1時間立ち上げっぱなしで1回程度)ページがリフレッシュされる
  • 入力内容が消えちゃうのもアレなので入力状態を保存しておいて復帰させたい。
  • 巷の入力状態復帰ライブラリはCookieやlocalstorageに保存するものがほとんど
  • じゃあライブラリ使わなくてもReactiveForms使ってたら余裕で実装できるかも?

というわけで実装してみよう…というあらましです。

行うこと

  1. ReactiveFormsのvalueChangesイベントをサブスクライブします。
  2. ReactiveFormsはデータを構造体でもっているので、そのデータをJSONにしてlocalstorageに保存します。
  3. ComponentがInitializeされた段階でlocalstorageにデータが存在する場合はpatchValueで入力されていたデータを復帰します。

以上。

極端な話、下記ソースコードだけで実現できるということですね。

(もちろん格納データの存在チェックやらは必要なのでこれ+もろもろは必要ですが!)

ngOnInit() {

    // 起動時にlocalstorageの値をFormsに反映
    const stVal = JSON.parse(localStorage.getItem('hogehoge'));
    this.sampleInputFormGroup.patchValue(stVal);

    this.sampleInputFormGroup.valueChanges.subscribe(value => {
        // 変更内容をlocalstorageに保存
        const valSt = JSON.stringify(value);
        localStorage.setItem('hogehoge', valSt)
    });

}

結果↓のGifのように動きます。

f:id:TakasDev:20190524223000g:plain

タブを閉じて再度開いても

入力状態が保持されている事がわかると思います。

まとめ

ReactiveFormsは構造体の状態で値の受け渡しができるので

ライブラリなしでも入力状態復帰処理は簡単に実装できますよ!ということがわかりました。

上の図で動いているソースのコードは下記になります。

Component - Service間をRxJSでつなげたりとか

ほんのちょっとだけ複雑になっています。

github.com

ごった煮のソースの一部で申し訳ないですが。。。 ><