NativeScript:路由器出口不起作用

NativeScript: router-outlet doesn't work

我在我的应用程序中遵循此 official example,它展示了如何在 {N} 中实现 <router-outlet>。我的应用程序的唯一区别是我想在模式页面中使用它。但它不是模式中的 <router-outlet> 元素,而是将内容加载为新页面。

模态组件

...
@Component({
    selector: "modal",
    template: `
        <StackLayout>
            <StackLayout>
                <Button text="First" [nsRouterLink]="['/first']"></Button>
                <Button text="Second" [nsRouterLink]="['/second']"></Button>
            </StackLayout>

            <router-outlet></router-outlet>
        </StackLayout>
    `
})
export class ModalComponent {
    constructor(private page:Page, public params:ModalDialogParams) {
        // ..
    }
}

app.routing.ts

...
export const routes:Routes = [
    { path: "", redirectTo: "home", pathMatch: "full" },
    { path: "home", component: HomeComponent },
    { path: "modal", component: ModalComponent },
    { path: "first", component: FirstComponent },
    { path: "second", component: SecondComponent }
];

export const dynamicComponents = [
    ModalComponent,
    FirstComponent,
    SecondComponent
];
...

app.module.ts

...
@NgModule({
    imports: [
        NativeScriptModule,
        NativeScriptFormsModule,
        NativeScriptHttpModule,
        NativeScriptRouterModule,
        NativeScriptRouterModule.forRoot(routes)
    ],
    declarations: [
        AppComponent,
        HomeComponent,
        ...dynamicComponents
    ],
    entryComponents: [
        ...dynamicComponents
    ],
    bootstrap: [AppComponent]
})
export class AppModule {}

知道为什么 /first/second 导航到新页面而不是加载到模态的路由器出口吗?

更新:

这似乎是一个错误。请参阅下面我的回答。

{
    path: 'modal',
    component: ModalComponent,
    children: [
        { path: "first", component: FirstComponent },
        { path: "second", component: SecondComponent }
    ]
}

在您的 app.module.ts 文件中进行以下更改以在没有 NativeScriptRouterModule 的情况下执行此操作:

  import { RouterModule } from '@angular/router';  

@NgModule({
imports: [...,RouterModule.forRoot(routes)],
declarations: [
        AppComponent,
        HomeComponent,
        ...dynamicComponents
    ],
    entryComponents: [
        ...dynamicComponents
    ],
    bootstrap: [AppComponent]
})
export class AppModule {}

当您关闭模式时,您还应该导航回模式路线,因为激活的路线将是 /first/second,并且您希望激活的路线在之后是 /modal模态消失了。

我创建了干净的 {N} + Angular 个项目并进行了测试。 事实证明,如果应用程序是使用具有 <page-router-outlet> 的组件引导的;它会忽略 (sub) page/component 中的任何 <router-outlet> 并且 nsRouteLink 导航 到新页面而不是在路由器中加载目标组件-出口。

没有 <page-router-outlet> 的测试(在根组件中)按预期工作。

我认为这是一个 bug,因为我在文档中没有看到任何关于必须使用 <page-router-outlet><router-outlet> 之一的通知(无论如何都没有任何意义)。

更新:打开了 issue here

更新 2:嵌套路由器(<router-outlet><page-router-outlet> 在根目录中)应该定义 children 才能工作。但是如果 <router-outlet> 处于模式中,它将不起作用(抛出 Error: No provider for ModalDialogParams!)。这绝对是一个错误,confirmed here