代码之家  ›  专栏  ›  技术社区  ›  Gargoyle

角度嵌入视图作为当前组件的对等视图

  •  0
  • Gargoyle  · 技术社区  · 3 年前

    我想在我的HTML中这样做:

    <tr *ngFor="let row of rows">
        <expandable-tree-row [columns]="cols" [data]="row"></expandable-tree-row>
    </tr>
    

    ExpandableTreeRowComponent 我用了一个 ViewContainerRef 因此 td 标记被放置为的直接子级 tr 元素,如下所示:

    constructor(public readonly container: ViewContainerRef, private readonly cdr: ChangeDetectorRef) {
    }
    
    ngAfterViewInit(): void {
        this.columns.forEach(x => this.container.createEmbeddedView(x.template))
        this.cdr.detectChanges()
    }
    

    这就是在正确的位置正确地添加每列的模板。但现在我仍然有一个问题 tr 元素为空 <expandable-tree-row> 因此,通过基本上将所有列向右移动一列,会扰乱表输出。

    现在我该如何摆脱第一个“坏”元素?

    如果我把它作为一个指令,放在 tr 元素,如下所示:

    <tr expandable-tree-row [columns]="cols"></tr>
    

    那么在视觉上它看起来是对的,但生成的HTML在技术上是错误的,因为它最终是这样的:

    <tr>...</tr>
    <td>...</td>
    <td>...</td>
    <tr>...</tr>
    <td>...</td>
    <td>...</td>
    

    换句话说 td 元素不是的子元素 tr 元素。

    0 回复  |  直到 3 年前
        1
  •  1
  •   Mehyar Sawas    3 年前

    如果使用属性选择器选项 <tr expandable-tree-row [columns]="cols"></tr> 您只需要进行一些调整: 而不是注射 ViewContainerRef 在构造函数中,将一个 ng-template 具有名为的模板变量 container 喜欢

    <ng-template #container></ng-template>
    

    并将其查询为 查看容器参考 具有 @ViewChild 喜欢

    @ViewChild('container', { read: ViewContainerRef })
      private container: ViewContainerRef;
    
    推荐文章