【发布时间】:2017-11-02 22:17:04
【问题描述】:
使用 Angular 4.1.3,我正在开发一个映射应用程序,它可以延迟加载各种工具模块。目前,有一个路由器插座,将工具放置在地图中。但是,我需要支持将该工具放在地图旁边的新选项卡中。该选项卡是响应加载工具模块而动态创建的,可以同时打开多个选项卡。
创建一个选项卡组件很简单,似乎在新选项卡中放置一个动态组件加载器(https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html)是一种将工具放置在选项卡中的合理方式。但是,我不知道如何实际获取对工具组件的引用以将其传递给加载器,因为它是延迟加载模块的一部分。有没有办法让路由器将它传递给我的 app.component 而不是通过路由器插座输出它?我曾想过将路由器插座放在一个隐藏的 div 中,然后在控制器中绑定到它,但这似乎很老套,我不确定它是否会起作用。
我见过的一些类似问题/答案似乎依赖于 SystemJS,但我使用的是 Webpack。
编辑:我在这里运行了一个基本的 plunker:http://plnkr.co/edit/RPbyQZ4LyHN9o9ey2MJT?p=preview
那里的代码有一个非常基本的组件动态添加到选项卡中
export class ContentPaneComponent implements OnInit {
@ViewChild('contentpane') el: ElementRef;
@Output() newContent: EventEmitter<any> = new EventEmitter();
private content: string;
private contentSubscription: Subscription;
private tab1 = new CompItem(htmlPaneComponent, {});
// private tab2 = new CompItem(LayerManagerComponent, {});
ngOnInit(): void {
}
}
tab1 中指定的组件必须包含在 content-pane.module entryComponents: [htmlPaneComponent] 的 entrycomponents 中
最终,当模块被延迟加载时,我想创建新的CompItem()s。当我激活如下路线时:
{
path: 'search', loadChildren:
'components/conference-room-search/conference-room-search.module#ConferenceRoomSearchModule'
}
我认为我需要路由器给我一个模块或其组件的引用。
【问题讨论】:
-
你能创建一个最小的例子来说明你想要实现的目标吗?
-
好的,我终于在plnkr.co/edit/RPbyQZ4LyHN9o9ey2MJT?p=preview 得到了一个非常基本的 plunker 来演示我所描述的部分内容。这基本上是此处显示的动态组件加载器的组合:angular.io/docs/ts/latest/cookbook/… 和此处的选项卡实现:embed.plnkr.co/afhLA8wHw9LRnzwwTT3M。
-
您是在问如何获得对作为模块的一部分动态加载的组件(即 ConferenceRoomSearchModule)的引用,以便您可以将其与动态组件加载器结合使用?
-
我还想要关于动态创建组件的任何建议,并延迟加载组件的代码,直到需要动态创建。
标签: angular typescript lazy-loading angular2-routing