2017-08-07 59 views
0

我有一個帶有@uirouter的Angular應用程序。我想根據用戶動態加載狀態,例如如果用戶位於特定組中,然後單擊指向特徵的特定菜單項,那麼我想加載特徵模塊的替代實現。angular-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'); 
     } 
     } 
    } 

這個過渡到應用程序時,然後導航到功能工作正常。當用戶不在功能頁面上時,它也適用於頁面刷新。 問題是,當用戶在功能頁上刷新時,它不起作用 - 然後功能版本-1加載而不是功能版本-2。但是,在導航到其他頁面並返回到功能頁面時,功能版本-2會再次加載。

這種行爲讓我覺得,雖然(DE)註冊stateRegistry的功能在簡單的場景裏面工作transitionService.onBefore,一般採用的(de)寄存器不適合用在這裏?或者,也許我錯過了某種狀態刷新調用?

有人可以在這一點上點亮嗎?什麼時候最好使用stateRegistry的(de)註冊功能?

回答

0

想通了,所以我分享萬一有人遇到類似的問題。技巧是調用stateRegistry函數內部傳遞給UIRouterModule.forChild()來處理頁面加載/刷新。

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)); 
    } 
    })