2017-07-05 18 views
0

...Store.jsの各ファイルが@observable@actionを含むmobxストアクラスです。次のような構造別のmobxストアでmobxストアにアクセスするにはどうすればよいですか?

stores/ 
    RouterStore.js 
    UserStore.js 
    index.js 

を想定index.jsは、ちょうどすべての店舗をエクスポートするので、別の内1つのストアにアクセスするための正しい方法は何ですか

import router from "./RouterStore"; 
import user from "./UserStore"; 

export default { 
    user, 
    router 
}; 

?すなわち私のUserStore内で、ユーザー認証が変更されたときに、RouterStoreからアクションをディスパッチする必要があります。

store.router.transitionTo("/dashboard")transitionTo)を使用して、I疲れimport store from "./index"UserStore内部、その後はRouterStoreクラス内のアクションです。

これは正しく動作していないようです。

答えて

1

StateがないStoreクラスではなく、観測値を含むストアのインスタンスに興味があるため、あなたの提案するソリューションは機能しません。

ストアの依存関係間にループがない場合、あるストアをコンストラクターの引数として別のストアに渡すことができます。以下のような

何か:ここ

routerStore = new RouterStore(); 
userStore = new UserStore(routerStore); 

stores = {user: userStore, router: routerStore}; 

あなたはそれが利用可能になるだろうということを意味USERSTOREにrouterStoreインスタンスを渡します。たとえば:

class UserStore { 
    routerStore; 
    constructor(router) { 
     this.routerStore = router 
    }; 

    handleLoggedIn =() => { 
     this.routerStore.transitionTo("/dashboard") 
     // Here the router has an observable/actions/... set up when it's initialized. So we just call the action and it all works. 
    } 
} 

もう一つの方法はUSERSTOREにある関数を呼び出す際に、引数として他のストア(routerStoreを言う)を渡すことである可能性があります。

+0

ああ、それは 'userStore = new UserStore(routerStore)'でなければ意味がありません。次に、UserStoreクラス内で通常のコンストラクタでルータを取り込むだけですか、それともmobxのものをいくつか適用する必要があります。つまり、そのストアをオブザーバなどにする必要がありますか?あなたは拡張された例を提供することができますか? – Ilja

+0

私はタイプミスを修正しました。気づいてくれてありがとう。 –

+0

通常のコンストラクタ引数としてUserStoreを使用できます。ストアのインスタンスを共有するだけで、新しいストアを作成しないので、何も指定する必要はありません。私は例を探すだろう –

関連する問題