Angular 6 UI 路由器 class 解析器

Angular 6 UI Router class resolvers

我目前正在研究 AngularJS 到 Angular 6 的迁移,所以我使用 Angular UI 路由器进行转换(@uirouter/angularjs、@uirouter/angular、@uirouter/angular-混合)。

我看到您可以使用解析器 类 来解析路由中的数据,但据我所知,这仅在 @angular/router 中可用。我通读了文档和源代码,确实在 UI 路由器中看到了对 "normal" 路由器的引用,所以我假设 UI 路由器只是扩展了 "normal"路由器。

现在我的问题是:有没有一种方法可以在 UI 路由器中使用解析器 类 而无需使用提供的 Resolvables?

@angular/router中显示的所需用法:

const routes = {
  states: [{
    name: 'page',
    url: '/page/:slug/',
    component: ViewPageComponent,
    resolve: {
      boatData: PageDataResolver
    },
    parent: 'public'
  }]
};

//Module for the states, the forRoot is defined in my app.module:
@NgModule({
  imports: [
    UIRouterUpgradeModule.forChild(routes)
  ],
  providers: [
    PageDataResolver,
    PageService //di in the PageDataResolver
  ]
})
export class PublicRoutesModule {}

以及 PageDataResolver 的内容:

import {Injectable} from '@angular/core';
import {NgRedux} from '@angular-redux/store';
import {PageService} from '../page.service';
import {IAppState} from '../../../redux/interfaces/state';
import {Resolve} from "@angular/router";

@Injectable()
export class BoatDataResolver implements Resolve<Promise<any>> {

    constructor(
        private _page: PageService,
        private ngRedux: NgRedux<IAppState>
    ) {}

    resolve(route): Promise<any> {
        return this._page.getPageInformation(
            this.ngRedux.getState().currentLanguage,
            route.paramMap.get('slug')
        ).toPromise();
    }
}

但是,当我使用这个确切的代码片段时,我收到一个运行时错误 "No provider for _page!"。所以看起来我注入的服务实际上并没有注入到 StateDeclaration 中。

希望您能帮上忙,感谢您的宝贵时间!

仅供参考 UI-Angular (@uirouter/angular) 的路由器是一个完全独立的实现——它不扩展 Angular 路由器 (@angular/router ).

@uirouter/angular 中的解析系统与 AngularJS 版本的解析系统工作原理非常相似。主要区别在于 AngularJS 中的服务必须始终使用 字符串令牌 注入。在 Angular 中,可以使用令牌对象(OpaqueTokenInjectionToken)或 class 引用来注入服务。

在混合模式 (@uirouter/angular-hybrid) 中,UI- 路由器解析始终使用字符串标记注入。如果您想在解析器中使用非字符串标记,请使用 $transition$ 字符串标记注入 Transition 对象。然后,使用 Transition.injector() API 访问您的服务。

export const pageDataResolver = ($transition$) => {
  const _page: PageService = $transition$.injector().get(PageService);
  const ngRedux: NgRedux<IAppState> = $transition$.injector().get(NgRedux);

  return this._page.getPageInformation(
            this.ngRedux.getState().currentLanguage,
            route.paramMap.get('slug')
        ).toPromise();
}

const routes = {
  states: [{
    name: 'page',
    url: '/page/:slug/',
    component: ViewPageComponent,
    resolve: {
      boatData: PageDataResolver
    },
    parent: 'public'
  }]
};

我已将文档添加到 @uirouter/angular-hybrid 以解释此限制: https://github.com/ui-router/angular-hybrid#resolve