2017-08-16 5 views
0

私はいくつかのサブストアを持っています。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 { 

} 
(アクションは、私は推測する...私の問題のために面白いではありません)以下の状態やレデューサーと Sub1Sub2を言うことができます

次に、これらの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

答えて

0

、そのオブジェクトを返します。あなたの州には2つのサブ状態があり、サブ1とサブ2と呼ばれています。それらはそれぞれ独自のオブジェクトです。それで、それは期待どおりに働いています。 'return state.sub1.sub1value;を実行する必要があります。

または私は通常、私はこのような何かをすることによって、特定の減速に加入している何をすべきか、そして、私は戻ってではなく、全体の状態、特定のサブ状態を取得:

constructor(private store: Store<Sub1State>) { 
    store.select('sub1').subscribe((state : Sub1State) => { 
    console.log(state); 
    this.sub1value$ = state.sub1value; 
    }); 
} 
+0

しかし、どのように、セレクタ機能が正しく動作し?私はほとんどの例で 'getValue1(state:Sub1State):string'のようなシグネチャを見ました。しかし、このセレクタ関数を 'store.select(getValue1) 'に渡すと、セレクタ関数に渡されたオブジェクトは' Sub1State'型ではなく 'sub1'ルート要素を持つので動作しません。また、サブ状態のストアに 'コンストラクタ(プライベートストア:Store )'が挿入されます。 –

+0

私が説明したことをするなら、あなたはsub1状態を取り戻すでしょう。 store.select( 'sub1')を実行します。申し込む(.......)。それはあなたにsub1状態オブジェクトを与えるでしょう – Kevin

+0

それはうまくいきました。しかし、私がこのようにすれば、簡単にサービスを書くことができます。ここでは、手動で購読し、購読を解除する必要があります。 Flux/Redux/Storeアーキテクチャのクールな機能の一部を失います。しかし私は手作業で購読したり購読を拒否したりすることは望まないので、アプリケーションの状態をスライスしてローカルの観察可能な状態に保存したいだけです。ここで私は動作すると期待しているが、動作しない例です:https://stackblitz.com/edit/angular-w34kua?file=app%2Fapp.component.ts –

関連する問題