質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

Q&A

1回答

1515閲覧

NgRx/component-store フォームの値で状態管理している値にupdateしようとするも、反映されない

tonkotsu_ramen

総合スコア6

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

0グッド

0クリップ

投稿2021/09/19 07:09

編集2021/09/19 11:46

やろうとしていること

Angular、プログラミング初心者です。
Angularアプリに@ngrx/component-storeを導入。
コンポーネントに設置しているフォームの値を状態管理オブジェクトに反映し、さらに反映された状態管理オブジェクトをそのコンポーネント で表示したい。

処理の流れとしては、下記の感じでしょうか。
コンポーネント→状態管理オブジェクト→コンポーネント

下記のリンクのcomponent-storeの使用例(ボタンをクリックすると数字が1ずつ増えていくアプリ)をベースとしています。
https://stackblitz.com/edit/angular-ngrx-component-store?file=src%2Fapp%2F

現在できていること、わからないこと

フォームに入力した値をfv.store.tsというstoreに渡し、submitボタンを押すとコンソールにフォームの値が表示されるので、storeファイルまでは値は渡ってきているようです。
その後の、フォームの値をどのように状態管理オブジェクトに渡す(update)のかわからない。
値の更新はupdaterというのを使えばいいのかなと思い、使ってみているのですが、次のエラーが出ています。

アドバイスやこの辺りについて詳しく書かれているサイトあれば、教えてくただきたく、宜しくお願い致します。

エラー

型 '{ fv: string; }' の引数を型 '(state: FvState, value: void) => FvState' のパラメーターに割り当てることはできません。 オブジェクト リテラルは既知のプロパティのみ指定できます。'fv' は型 '(state: FvState, value: void) => FvState' に存在しません。

コード

// view <form [formGroup]="postUser" (ngSubmit)="postName()"> username:<input type="text" formControlName="username" /><br /> <button type="submit">Submit</button> </form> <div class="state">This form Value is {{ fv$ | async }}</div>
// login.component.ts import { Component, OnInit, VERSION } from '@angular/core'; import { FormGroup, FormControl } from '@angular/forms'; import { Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; import { FormStore } from '../fv.store'; @Component({ selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.css'], }) export class LoginComponent implements OnInit { constructor( private readonly formStore: FormStore ) {} ngOnInit(): void {} postUser = new FormGroup({ username: new FormControl('', []), }); readonly fv$ = this.formStore.fv$; postName() { this.formStore.add(this.postUser.value); } }
// fv.store.ts import { Injectable } from '@angular/core'; import { ComponentStore } from '@ngrx/component-store'; import { Observable } from 'rxjs'; export interface FvState { fv: any; } @Injectable() export class FormStore extends ComponentStore<FvState> { constructor() { super({ fv: '' }); } fv$: Observable<string> = this.select((state) => state.fv); add(user: any) { const name = JSON.stringify(user.username);   console.log(name) // ⇦フォーム値は問題なく表示されている。 this.fv$ = this.updater({ fv: name });// ⇦この部分の書き方がよくわかりません。 } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

手前味噌で恐れいりますが、解説記事をQiitaに書いているのでご参照ください。
https://qiita.com/seapolis/items/97258d7c2b11148d0a81#ngrx
サンプルコードです。
https://github.com/kaito3desuyo/angular-state-example/blob/master/src/app/ngrx-state/component-store/ngrx-state.component-store.ts

結論から申し上げると、this.updater()を使うことは間違ってはいないのですが、
この関数は「関数を返す関数」であるため、実際のところは以下のようにするのが適切です。

// fv.store.ts import { Injectable } from '@angular/core'; import { ComponentStore } from '@ngrx/component-store'; import { Observable } from 'rxjs'; export interface FvState { fv: any; } @Injectable() export class FormStore extends ComponentStore<FvState> { constructor() { super({ fv: '' }); } fv$: Observable<string> = this.select((state) => state.fv); add = this.updater((state, name: string) => ({...state, fv: name})); }

投稿2021/10/21 11:57

編集2021/10/21 11:58
kaito3desuyo

総合スコア143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問