2017-08-07 66 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)); 
    } 
    }) 
相关问题