2017-08-07 14 views
0

@uirouterでAngularアプリがあります。たとえばユーザーなどに基づいて状態を動的にロードしたいとします。ユーザーが特定のグループに所属し、特定のメニュー項目をクリックしてフィーチャーにルーティングする場合、フィーチャー・モジュールの代替実装をロードしたいと考えています。angle-ui-routerランタイム状態

州名は同じですので、私はuiRouter.stateRegistry.deregisterとuiRouter.stateRegistry.registerを使ってこれを処理しようとしました。ユーザー資格情報を知る必要があるため、ログインからアプリケーションへの移行時に、ユーザーがログインするときに関連するコールを行います。これについては、uiRouter.transitionService.onBeforeを使用しています。コードはおおよそ次のとおりです。

uiRouter.transitionService.onBefore({}, transition => loginTransition(uiRouter, injector, transition)); 

    const isLogin = transition => transition.from().name === 'login' && transition.to().name === 'main'; 
    const isRefresh = transition => transition.from().url === '^'; 

    const loginTransition = (uiRouter: UIRouter, injector: Injector, transition: Transition) => { 
     if(isLogin(transition) || isRefresh(transition)) { 
     if(injector.get('authService').getUser() === 'specificUser') { 
      uiRouter.stateRegistry.deregister('feature-version-1'); 
      uiRouter.stateRegistry.register('feature-version-2'); 
     } 
     } 
    } 

これは、アプリに移行してから機能に移動すると問題なく動作します。また、ユーザーが機能ページにいないときにページを更新する機能もあります。 機能ページでユーザーが更新したときに機能しないという問題があります。機能バージョン2ではなく機能バージョン1が読み込まれます。しかし、他のページに移動してフィーチャーページに戻ると、フィーチャーバージョン2が再びロードされます。

stateRegistryの(de)レジスタ機能は、transitionService.onBefore内の単純なシナリオで機能しますが、一般的に(de)レジスタはここで使用するのに適していないと思いますか?または、私は状態リフレッシュコールのいくつかの並べ替えが不足している?

誰かがこの光を放つことができますか? stateRegistryの登録機能を使用するのはいつですか?

答えて

0

誰かが同様の問題に遭遇した場合に備えて共有しています。トリックは、UIRouterModule.forChild()に渡された関数内でstateRegistryを呼び出して、ページのロード/リフレッシュを処理します。

const register = (uiRouter: UIRouter, injector: Injector) => { 
    if(injector.get('authService').getUser() === 'specificUser') { 
     uiRouter.stateRegistry.deregister('feature-version-1'); 
     uiRouter.stateRegistry.register('feature-version-2'); 
    } 
} 

UIRouterModule.forChild({ 
    states: [/* states here */], 
    config: (uiRouter: UIRouter, injector: Injector, module: StatesModule) => { 
     register(uiRouter, injector); 
     uiRouter.transitionService.onBefore({from:'login', to:'main'}, transition => register(uiRouter, injector)); 
    } 
    })