有时我们只需要应用程序页面的一部分从一个组件更改为另一个组件,而我们希望页面的其余部分保持原样。
想象一下,你有一个带有多个标签的标签视图,并且希望每个标签独立于整个页面进行导航。你可以尝试通过在每个标签中添加所有必需的组件来解决这个问题,然后使用一个巧妙的 *ngIf 来显示和隐藏它们。但是,一旦你添加了几个这样的标签,你就会意识到这并不是一个巧妙的方法。<router-outlet></router-outlet>
const routes: Routes = [ { path: '', redirectTo: '/home/(catoutlet:cats//dogoutlet:dogs)', pathMatch: 'full' }, { path: 'home', component: HomeComponent, children: [ { path: 'cats', component: CatsComponent, outlet: 'catoutlet'}, { path: 'cats/:name', component: CatDetailsComponent, outlet: 'catoutlet'}, { path: 'dogs', component: DogsComponent, outlet: 'dogoutlet'}, { path: 'dogs/:id', component: DogDetailsComponent, outlet: 'dogoutlet'} ]} ];
<ActionBar title="Nested Navigation" class="action-bar"></ActionBar>
<TabView class="tab-view">
<StackLayout *tabItem="{title: 'Cats'}">
<router-outlet name="catoutlet"></router-outlet>
</StackLayout>
<StackLayout *tabItem="{title: 'Dogs'}">
<router-outlet name="dogoutlet"></router-outlet>
</StackLayout>
</TabView>
以下是你的预期结果
<GridLayout rows="*, 2*" class="page">以下是你的预期结果:
<StackLayout row="0">
<Label text="Cats" class="h2 text-center action-bar"></Label>
<router-outlet name="catoutlet"></router-outlet>
</StackLayout>
<StackLayout row="1">
<Label text="Dogs" class="h2 text-center action-bar"></Label>
<router-outlet name="dogoutlet"></router-outlet>
</StackLayout>
</GridLayout>
<Button现在我们只需要创建 CatsDetailComponent,它将显示猫的名称并允许用户导航回去。
text="Show Scratchy"
[nsRouterLink]="['/home', { outlets: { catoutlet: ['cats', 'Scratchy'] } } ]">
</Button>
<Button
text="Show Hissy"
[nsRouterLink]="['/home', { outlets: { catoutlet: ['cats', 'Hissy'] } } ]">
</Button>
<Button
text="Show Mystique"
[nsRouterLink]="['/home', {outlets: { catoutlet: ['cats', 'Mystique']}}]">
</Button>
ngOnInit() { this.name = this.route.snapshot.params['name']; }然后,CatDetailsComponent 模板应该相当简单。
<Label [text]="'Hello ' + name"></Label>- 显示一个返回按钮,它将使用 nsRouterLink 导航回去。
<Label text="Did you knock the plants off the window sill?" textWrap="true"></Label>
<Button瞧!这就是我们使用nsRouterLink在 catoutlet 中导航所需的一切。
text="Go Back"
[nsRouterLink]="['/home', { outlets: { catoutlet: ['cats'] } } ]">
</Button>
navigateToDetails(id: number) {然后,在DogsComponent 模板中,我们只需要创建一个列表视图,并添加一个点击事件,该事件将调用navigateToDetails。
this.router.navigate([
'/home', { outlets: { dogoutlet: ['dogs', id] } }
])
}
<ListView [items]="dogs" class="list-group" height="100%">
<template let-item="item" >
<Label
(tap)="navigateToDetails(item.id)"
[text]="item.name"
class="list-group-item">
</Label>
</template>
</ListView>
goBack() {然后,在DogsDetailsComponent 模板中,我们只需要
this.router.navigate([
'/home', { outlets: { dogoutlet: ['dogs'] } }
])
}
<Label [text]="dog.name"></Label>- 添加返回按钮。
<Label text="Who is the good doggie?"></Label>
<Label [text]="'Max Weight:' + dog.maxWeight + ' inches'"></Label>
<Label [text]="'Max Height:' + dog.maxHeight + ' pounds'"></Label>
<Button text="Go Back" (tap)="goBack()"></Button>
你也可以在一个调用中导航到多个出口。
只需在 outlet 参数中提供要更新的所有出口即可。
例如,我们可以添加一个重置按钮,该按钮将导航到猫和狗视图的默认值,只需这样做即可
<Button
text="Reset"
[nsRouterLink]="['/home', { outlets: { catoutlet: ['cats'], dogoutlet: ['dogs'] } } ]">
</Button>
你可以在我的 github 中找到整个解决方案
nativescript-nested-router