我有一个带有@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)注册功能?