在UI-Router的“否则”功能中访问服务

时间:2017-12-14 03:00:01

标签: angular angular-ui-router

在UI-Router的RootModule.otherwise中,如果用户打开应用程序无法识别的URL,我们可以指定重定向用户的位置。我一直在使用简单格式,只是一个指定目标状态名称的字符串:

@NgModule({
    imports: [UIRouterModule.forRoot({
        states: [
            {
                name: "home",
                url: "/home",
                component: HomeComponent
            }
        ],
        otherwise: "/home"
    })],
    exports: [UIRouterModule],
    providers: []
})
export class AppRoutingModule { }

但现在我需要通过调用服务来获取数据,以确定我应该重定向用户的目标状态。我尝试了otherwise的函数格式,希望能够通过注入器访问我的服务:

otherwise: (matchValue, url: UrlParts, router: UIRouter) => {
    // this didn't work, router.globals.transition is not available
    const userPrefSvc = router.globals.transition.injector().get(UserPreferenceService);
}

但它没有用,我无法找到一种方法来控制注射器。

是否可以从otherwise功能访问服务?

1 个答案:

答案 0 :(得分:1)

这个答案实际上来自Christopher Thielen

设置otherwise功能也可以在配置功能中完成,我们可以访问注入器:

@NgModule({
    imports: [UIRouterModule.forRoot({
        states: [
            {
                name: "home",
                url: "/home",
                component: HomeComponent
            }
        ],
        config: (uiRouter: UIRouter, injector: Injector, statesModule: StatesModule) => {
            let userPrefSvc = injector.get(UserPreferenceService);

            uiRouter.urlService.rules.otherwise((matchValue, url, router) => {
                // ...
                router.stateService.go("home");
                // or
                return "/home";
            });
        }
    })],
    exports: [UIRouterModule],
    providers: []
})
export class AppRoutingModule { }