给定以下模块,如何创建路由,以便当应用程序加载此模块时,它将路由到CComponent,并将AComponent加载到指定的路由器出口search-results中
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { AComponent } from './a.component';
import { BComponent } from './b.component';
import { CComponent } from './c.component';
@NgModule({
declarations: [
AComponent,
BComponent,
CComponent
],
imports: [
BrowserModule,
RouterModule.forRoot([
{
path: '',
pathMatch: 'prefix',
component: CComponent,
children: [
{
path: 'a',
component: AComponent,
outlet: 'search-results'
},
{
path: 'b',
component: BComponent,
outlet: 'search-results'
}
]
])
],
providers: [],
bootstrap: [CComponent]
})
export class AppModule {}a.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'a-component',
template: `
<div class="tabs row">
<h3 [routerLink]="[{ outlets: { 'search-results': ['a'] } }]" class="tab" routerLinkActive="active">
A
</h3>
<h3 [routerLink]="[{ outlets: { 'search-results': ['b'] } }]" class="tab" routerLinkActive="active">
B
</h3>
</div>
<router-outlet name="search-results"></router-outlet>
`
})
export class AComponent {
}我尝试了很多不同的路线:
使用上面的配置,页面会加载,但是AComponent不会加载到屏幕上。
如果我将CComponent更新为具有以下内容:
export class CComponent {
constructor(
private route: ActivatedRoute,
private router: Router
) {
router.navigate(
[
{
outlets: {
'search-results': ['a']
}
}
], { relativeTo: route });
}
}然后一切看起来都正常,但是在父元素的构造函数中触发导航似乎是错误的。
如果我更新子路由并将{ path: 'a', component: AComponent, outlet: 'search-results' }替换为{ path: '', component: AComponent, outlet: 'search-results' },路由器似乎在出口中正确地加载了该组件,但是routerLinkActive指令似乎没有生效,因为active类没有添加到第一个h3,而将routerLink更新到outlets: { 'search-results': ['a'] }不允许导航到BComponent后返回到AComponent。
我试过一些以上的变体,但都没有成功。
是否有一种方法来配置路由,以便默认路由将在主未命名的CComponent router-outlet 中加载,在命名的 search-results router-outlet?中加载 AComponent
普朗克
发布于 2018-01-16 14:14:05
目前,您正在定义到基本路由的子路由,其中之一是/a (将AComponent加载到search-results出口的路径),但是当应用程序加载时,您实际上并不打算进入该路径。当您必须在navigate中对CComponent中的路由(在加载时初始化它)时,它可以工作。
如果希望最初使用(search-results):a路由活动加载应用程序,则可以在路由定义中使用属性。
在您的示例中,我将在初始路由(空路径:'')上进行模式匹配,然后重定向到加载了/a的路径,如下所示:
RouterModule.forRoot([
/* this line will match the initially loaded route and
immediately redirect to the child route 'a', which loads
`AComponent` into the `search-results` outlet */
{ path: '', pathMatch: 'full', redirectTo: '(search-results:a)'},
{
path: '',
pathMatch: 'prefix',
component: CComponent,
children: [
{
path: 'a',
component: AComponent,
outlet: 'search-results'
},
{
path: 'b',
component: BComponent,
outlet: 'search-results'
}
]
}
])注意,在上面的片段中,order很重要。它将匹配空路径,重定向到子路由,并在指定的出口加载所需的组件(正如您在代码中定义的那样)。
https://stackoverflow.com/questions/48283034
复制相似问题