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。
我在我的应用程序中遵循此 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。