我有通过路线配置的主要详细类型的应用程序。
Routes = [
{
path: '',
redirectTo: '/master',
pathMatch: 'full'
},
{
path: 'master',
component: MasterComponent,
children: [
{
path: ':id',
component: DetailsComponent
}
]
}
]
主组件的html
<div>...</div>
<router-outlet></router-outlet>
它完美无缺。但现在我的孩子有不同的类型和数据。所以我想要渲染DetailsType1Component,DetailsType2Component,DetailsType3Component ......而不是DetailsComponent,它们是固定的和预定义的。我想基于路由中存在的id来获取数据,然后决定它是什么类型的子节点,然后渲染一个DetailsType1Component ......
如何实现?
由于
答案 0 :(得分:2)
您可以创建一个公共详细信息容器组件并将路由器路由到该组件,并且在该组件中,您可以根据您的条件动态加载组件。检查official docs!
container.component.ts
export class ContainerComponent implements OnChanges{
@Input() component: Type<any>;
constructor(private componentFactoryResolver: ComponentFactoryResolver) { }
ngOnChanges() {
if(this.component) this.loadComponent();
}
loadComponent() {
let componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.component);
let viewContainerRef = this.messageHost.viewContainerRef;
viewContainerRef.clear();
viewContainerRef.createComponent(componentFactory);
}
}
container.component.html
<div>
<!-- placeholder for dynamic components -->
<ng-template message-host></ng-template>
</div>
在上面的例子中,它的加载动态组件由@Input()属性
传递答案 1 :(得分:1)
Angular希望路由是静态的。如果您需要动态,它会提供Router.resetConfig功能,但我最好在这里使用其他方法。您可以根据提供的ID动态加载详细信息组件。我们假设我们有一些Details Component容器元素:
@Component({
selector: 'details-container',
template: `
<ng-container *ngComponentOutlet="content"></ng-container>
`
})
export class DetailsComponent implements OnInit {
content
constructor(private route: ActivatedRoute) {
let id = this.route.snapshot.paramMap.get('id')
switch (id) {
case '1':
this.content = DetailsType1Component
break
case '2':
this.content = DetailsType2Component
break
default:
this.content = DetailsTypeDefaultComponent
}
}
}
它使用*ngComponentOutlet
指令加载您需要的组件。在从url读取id
参数后,在构造函数中确定了哪一个。