使用 angular2 在同一个路由器插座中加载多个组件
Load multiple component in the same router-outlet with angular2
我的 angular2 应用程序的根组件有以下模板:
<main class="main">
<div class="main__container">
<div class="main__left-area">
<router-outlet name="left-zone"></router-outlet>
</div>
<div class="main__right-area">
<router-outlet name="right-zone"></router-outlet>
</div>
</div>
</main>
以及以下路线:
import { HomeSummaryComponent } from "../components/home-summary/home-summary.component"
import { DataSummaryComponent } from "../components/data-summary/data-summary.component"
import { AskSummaryComponent } from "../components/ask-summary/ask-summary.component"
import { Routes } from "@angular/router"
export const AppRoutes: Routes = [
{
path: "",
component: HomeSummaryComponent,
outlet: "left-zone"
},
{
path: "",
component: DataSummaryComponent,
outlet: "right-zone"
}
];
它实际上工作得很好,但我希望能够在 "right-zone" 中加载多个组件(实际上在左侧也是如此)。这个想法是这样的:
{
path: "",
components: [ DataSummaryComponent, AskSummaryComponent ],
outlet: "right-zone"
}
控制器将一个接一个地附加。目前支持吗?如果不是,是否可以扩展现有的 RouterOutlet 来这样做?
谢谢
只能给一个组件分配一个Route,你可以做的是添加一个由DataSummaryComponent & AskSummaryComponent
组成的父组件并在路由中配置它。
更新:
如评论中所述,您可以创建一个通用组件,该组件使用路由中的数据 属性 配置动态加载组件,
路由配置
const appRoutes: Routes = [
{ path: '', redirectTo: '/route1', pathMatch: 'full' },
{ path: 'route1', component: MasterComponent, data: {puppets : [PuppetComponent1]} },
{ path: 'route2', component: MasterComponent, data: {puppets : [PuppetComponent2, PuppetComponent3]}},
{ path: 'route3', component: MasterComponent, data: {puppets : [PuppetComponent1, PuppetComponent2, PuppetComponent4]}}
];
主组件
@Component({
template: `<h1>I am the Master of components</h1>
<hr />
<div #puppetContainer></div>
`
})
class MasterComponent {
@ViewChild('puppetContainer', { read: ViewContainerRef }) puppetContainer: ViewContainerRef;
constructor(
private router: Router,
private route: ActivatedRoute,
private _componentFactoryResolver: ComponentFactoryResolver,
private viewContainer: ViewContainerRef) {
}
ngOnInit(){
this.route.data
.subscribe(data => {
if(!!data && !!data.puppets && data.puppets.length > 0){
data.puppets.map(puppet => {
let componentFactory = this._componentFactoryResolver.resolveComponentFactory(puppet);
this.puppetContainer.createComponent(componentFactory);
});
}
});
}
}
勾选这个Plunker!!
希望对您有所帮助!!
我的 angular2 应用程序的根组件有以下模板:
<main class="main">
<div class="main__container">
<div class="main__left-area">
<router-outlet name="left-zone"></router-outlet>
</div>
<div class="main__right-area">
<router-outlet name="right-zone"></router-outlet>
</div>
</div>
</main>
以及以下路线:
import { HomeSummaryComponent } from "../components/home-summary/home-summary.component"
import { DataSummaryComponent } from "../components/data-summary/data-summary.component"
import { AskSummaryComponent } from "../components/ask-summary/ask-summary.component"
import { Routes } from "@angular/router"
export const AppRoutes: Routes = [
{
path: "",
component: HomeSummaryComponent,
outlet: "left-zone"
},
{
path: "",
component: DataSummaryComponent,
outlet: "right-zone"
}
];
它实际上工作得很好,但我希望能够在 "right-zone" 中加载多个组件(实际上在左侧也是如此)。这个想法是这样的:
{
path: "",
components: [ DataSummaryComponent, AskSummaryComponent ],
outlet: "right-zone"
}
控制器将一个接一个地附加。目前支持吗?如果不是,是否可以扩展现有的 RouterOutlet 来这样做?
谢谢
只能给一个组件分配一个Route,你可以做的是添加一个由DataSummaryComponent & AskSummaryComponent
组成的父组件并在路由中配置它。
更新:
如评论中所述,您可以创建一个通用组件,该组件使用路由中的数据 属性 配置动态加载组件,
路由配置
const appRoutes: Routes = [
{ path: '', redirectTo: '/route1', pathMatch: 'full' },
{ path: 'route1', component: MasterComponent, data: {puppets : [PuppetComponent1]} },
{ path: 'route2', component: MasterComponent, data: {puppets : [PuppetComponent2, PuppetComponent3]}},
{ path: 'route3', component: MasterComponent, data: {puppets : [PuppetComponent1, PuppetComponent2, PuppetComponent4]}}
];
主组件
@Component({
template: `<h1>I am the Master of components</h1>
<hr />
<div #puppetContainer></div>
`
})
class MasterComponent {
@ViewChild('puppetContainer', { read: ViewContainerRef }) puppetContainer: ViewContainerRef;
constructor(
private router: Router,
private route: ActivatedRoute,
private _componentFactoryResolver: ComponentFactoryResolver,
private viewContainer: ViewContainerRef) {
}
ngOnInit(){
this.route.data
.subscribe(data => {
if(!!data && !!data.puppets && data.puppets.length > 0){
data.puppets.map(puppet => {
let componentFactory = this._componentFactoryResolver.resolveComponentFactory(puppet);
this.puppetContainer.createComponent(componentFactory);
});
}
});
}
}
勾选这个Plunker!!
希望对您有所帮助!!