Angular8动态创建组件作为mat-expansion-panel-header的直接子代

时间:2019-10-23 09:34:29

标签: html angular typescript angular-material angular8

我想在<mat-expansion-panel-header>内的<mat-expansion-panel>元素的左右两端添加两个HTML元素。如果我直接在HTML模板中添加元素(<my-html-element>),它们将自动插入到<span class="mat-content">...中,该元素由angular动态生成,并包含在<mat-expansion-panel-header></mat-expansion-panel-header>中定义的所有内容。模板。

模板:

<mat-expansion-panel>
        <mat-expansion-panel-header>
            <my-html-element></my-html-element>        <===============
            <mat-panel-title>
                <div class="title">
                    Hello World
                </div>
            </mat-panel-title>
            <my-html-element></my-html-element>        <===============
        </mat-expansion-panel-header>
...
</mat-expansion-panel>

在浏览器中呈现,Angular如下创建它:

</mat-expansion-panel>
<mat-expansion-panel-header>
    <span class="mat-content">
        <mat-panel-title ...>
            <div ... class="title"> Hello World </div>
        </mat-panel-title>
        <my-html-element></my-html-element>        <===============
        <my-html-element></my-html-element>        <===============
    </span>

    <span class="mat-expansion-indicator ...></span>
</mat-expansion-panel-header>
</mat-expansion-panel>

我的元素呈现在标题的中间,而不是在边框处所期望的。结果应如下所示:

</mat-expansion-panel>
<mat-expansion-panel-header>
   <my-html-element></my-html-element>        <===============
    <span class="mat-content">
        <mat-panel-title ...>
            <div ... class="title"> Hello World </div>
        </mat-panel-title>
    </span>

    <span class="mat-expansion-indicator ...></span>
    <my-html-element></my-html-element>        <===============
</mat-expansion-panel-header>
</mat-expansion-panel>

我已经尝试使用@ViewChild(在下面的代码中称为expansionHeader)访问扩展面板标题,并尝试如下动态创建组件:

ngAfterViewInit(): void {
    const factory = this.factoryResolver.resolveComponentFactory(MyHtmlElement);
    const reference = this.expansionHeader.createComponent(factory);
}

但是,使用此代码,将这些组件作为同级添加到扩展面板标题中,而不是像我想要的那样作为其直接子级添加。

我的问题是我无法使用<mat-expansion-panel-header>访问@ViewChild的直接子级,因为它们是动态生成的。如果可以访问直接的孩子,则可以将组件作为同级对象添加到该孩子...

有什么方法可以将生成的组件添加为mat-expansion-panel-header的直接子代,一个作为第一个子代,另一个作为最后一个子代?

0 个答案:

没有答案