在单个组件中使用 Router for web 和 RouterExtensions for mobile

Using Router for web and RouterExtensions for mobile in a single component

我正在尝试在我的项目中在 Web 和移动应用程序版本之间共享代码。

我有一个需要编程导航的组件,因此我需要为 Web 版本注入 Angular Router(来自 '@angular/router')和 NativeScript RouterExtensions(来自 '@nativescript/angular') 用于移动版本。是否有推荐的方法将依赖项“动态地”注入组件,以便编译的每个目标都获得正确的依赖项?

第一步你应该创建一个注入令牌

// src/app/tokens.ts
import {InjectionToken} from '@angular/core';

export const UNIVERSAL_ROUTER = new InjectionToken<string>('Custom router');

之后,在与 Web 应用程序相关的模块中(我假设它是 app.module.ts),您在供应商列表中定义它

// src/app/app.module.ts
...
import {Router, RouterModule} from '@angular/router';
import {UNIVERSAL_ROUTER} from '~/app/tokens';

@NgModule({
    imports: [...],
    declarations: [...],
    providers: [
        {provide: UNIVERSAL_ROUTER, useExisting: Router},
    ],
    bootstrap: [AppComponent],
})
export class AppModule {}

同时,您在声明移动应用程序(即 app.module.tns.ts)的模块中将此令牌定义为 RouterExtension

// src/app/app.module.tns.ts
...
import {NativeScriptRouterModule, RouterExtensions} from 'nativescript-angular/router';
import {UNIVERSAL_ROUTER} from '~/app/tokens';

@NgModule({
    imports: [...],
    declarations: [...],
    providers: [
        {provide: UNIVERSAL_ROUTER, useClass: RouterExtensions},
    ],
    bootstrap: [AppComponent],
    schemas: [NO_ERRORS_SCHEMA],
})
export class AppModule {}

完成后,您可以通过 @Inject 装饰器注入路由器,例如

constructor(@Inject(UNIVERSAL_ROUTER) private router) {}

并在任何需要的地方获得特定于平台的路由器。