私はいくつかのサブストアを持っています。ngrx/store 4:ストアから選択すると予期しないサブ状態になる
Sub1を::
export interface Sub1State {
sub1value: string
}
export function sub1reducer(state: Sub1State, action: Action): Sub1State {
...
}
SUB2:
export interface Sub2State {
sub2value: number
}
export function sub2reducer(state: Sub2State, action: Action): Sub2State {
}
(アクションは、私は推測する...私の問題のために面白いではありません)以下の状態やレデューサーと
Sub1
と
Sub2
を言うことができます
次に、これらの2つのサブ状態を1つにまとめます。ActionReducerMap<ApplicationState>
:
export interface ApplicationState {
sub1: Sub1State,
sub2: Sub2State
}
export const reducers: ActionReducerMap<ApplicationState> = {
sub1: sub1reducer,
sub2: sub2reducer
};
および格納するために、それを「REGISTER」:
StoreModule.forRoot(reducers)
は今、角度成分で、私はSub1
ストアを選択し、sub1value
文字列を取得したいです。だから私...ログ声明で
sub1value$: Observable<string>;
constructor(private store: Store<Sub1State>) {
this.sub1value$ = store.map(state => {
console.log(state);
return state.sub1value;
});
}
を行う、私は次のオブジェクト(Sub1Stateオブジェクト)を取得することを期待する:
{
sub1value: 'initial value'
}
しかし、私は実際に取得することは、このオブジェクトです:
{
sub1: {
sub1value: 'initial value'
}
}
これは意図したとおりですか?はいの場合、インタフェースSub1Stateでどのように作業しますか? sub1
はインターフェイスの一部ではないためです。
また、を呼び出すときにエラー(コンパイルエラーもランタイムエラーもありません)が発生しないのは、明らかに間違っているのはstate.sub1.sub1value
であるためです。ランタイムエラーはありません私は理解しています、それは単に定義されていません。しかし、TypeScriptコンパイラは私の意見ではここにエラーを投げるべきです。
私は本当に混乱しています:/
ここでEDIT
が、私はそれが動作を期待する方法の例です:あなたは、アプリケーションの状態を取得するとhttps://stackblitz.com/edit/angular-w34kua?file=app%2Fapp.component.ts
しかし、どのように、セレクタ機能が正しく動作し?私はほとんどの例で 'getValue1(state:Sub1State):string'のようなシグネチャを見ました。しかし、このセレクタ関数を 'store.select(getValue1) 'に渡すと、セレクタ関数に渡されたオブジェクトは' Sub1State'型ではなく 'sub1'ルート要素を持つので動作しません。また、サブ状態のストアに 'コンストラクタ(プライベートストア:Store)'が挿入されます。 –
私が説明したことをするなら、あなたはsub1状態を取り戻すでしょう。 store.select( 'sub1')を実行します。申し込む(.......)。それはあなたにsub1状態オブジェクトを与えるでしょう – Kevin
それはうまくいきました。しかし、私がこのようにすれば、簡単にサービスを書くことができます。ここでは、手動で購読し、購読を解除する必要があります。 Flux/Redux/Storeアーキテクチャのクールな機能の一部を失います。しかし私は手作業で購読したり購読を拒否したりすることは望まないので、アプリケーションの状態をスライスしてローカルの観察可能な状態に保存したいだけです。ここで私は動作すると期待しているが、動作しない例です:https://stackblitz.com/edit/angular-w34kua?file=app%2Fapp.component.ts –