Angular - 一个接一个地添加组件(在代码中)

标签 angular

我正在尝试使用 Angular 构建一个可调整大小的面板系统。 因此,您可以使用栏分隔多个容器,以允许用户调整它们的大小。

目前我有一个解决方案,要求开发人员编写以下 HTML 代码:

<split-pane>
    <container>Some content</container>
    <separator></separator>
    <container>Another content</container>
    <separator></separtor>
    <container>Content ?</container>
<split-pane>

split-panecontainerseparator 都是自定义的 angular2 组件。 拆分 Pane 模板只是

<ng-content></ng-content>

我使用 @ContentChildren(ContainerComponent)split-pane 中访问 containersepartor>@ContentChildren(SeparatorComponent)

我在这个解决方案中遇到的问题是,开发人员需要在所有容器之间手动添加每个分隔符

我想要一个解决方案,其中所需的 HTML 是:

<split-pane>
    <container>Some content</container>
    <container>Another content</container>
    <container>Content ?</container>
<split-pane>

分隔符 组件将自动添加。 但我不知道如何用 Angular 做到这一点。 嵌入 似乎是解决这个问题的一种方法,但我无法理解它。

有什么想法吗?

谢谢

最佳答案

如果我们需要动态加载某些东西,那么首先我们需要像这样对我们的动态组件使用 Angular 编译器:

  ...
  entryComponents: [SeparatorComponent]
})
export class AppModule {}

所以我们想要的模板是这样的:

 <split-pane>
   <container>Some content</container>
   <container>Another content</container>
   <container>Content ?</container>
 </split-pane>

为了在 container 元素之间添加一些东西,我们应该为每个 container 获取 ViewContainerRef。我会按照以下方式在 SplitPaneComponent 中执行此操作

@ContentChildren(ContainerComponent, { read: ViewContainerRef }) containersRefs: QueryList<ViewContainerRef>;

然后只需使用 ComponentFactoryResolver 获取组件工厂并在 ViewContainers 上方接收到 container 标签后添加 SeparatorComponent 。看起来应该是这样的:

ngAfterContentInit() {
  this.containersRefs.forEach((vcRef: ViewContainerRef, index: number, arr: any[]) => {
    if(index === arr.length - 1) {
        return;
    }

    let compFactory = this.resolver.resolveComponentFactory(SeparatorComponent);
    let compRef = vcRef.createComponent(compFactory);
    this.separators.push(compRef);
  })
}

Plunker Example

关于Angular - 一个接一个地添加组件(在代码中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43630541/

相关文章:

angular - 使用 store 和 http 使用 ngFor 进行无限循环

angular - 以 Angular 访问此对象时未定义

angular - 向 Ionic2 的 ionic 幻灯片添加水平滚动条

javascript - Angular 2 可观察到的问题

javascript - 根据字符串: Angular排序

Angular Breadcrumb 显示用户到达当前页面的路线

angular - ngrx store.dispatch 可以被节流/去抖动或者 ngrx Action 可以被节流/去抖动吗?

javascript - 如何验证两个对象数组

javascript - Angular 2 D3 树渲染不正确

angular - Angular 组件是否与自定义元素(来自网络组件技术)相同?