遍历ng内容项并将其包装在自己的嵌套div中

时间:2018-10-01 19:21:36

标签: html angular angular6 ng-content

我已经知道尚不支持此功能,但是我想知道是否有人找到了解决此问题的解决方法。

我目前拥有的是具有此模板的父组件:

<dxi-item location='after' class="osii-item-content">
    <span><ng-content select="[osii-page-button]"></ng-content></span>
</dxi-item>

正在创建以下内容:

<dxi-item location='after' class="osii-item-content">
    <button> // first button returned by ng-content </button>
    <button> // second button returned by ng-content </button>
    <button> // third button returned by ng-content </button>
</dxi-item>

但是我想做的是将以下html进行联网:

<dxi-item location='after' class="osii-item-content">
    <button> // first button returned by ng-content </button>
</dxi-item> 

<dxi-item location='after' class="osii-item-content">
    <button> // second button returned by ng-content </button>
</dxi-item>

<dxi-item location='after' class="osii-item-content">
    <button> // third button returned by ng-content </button>
</dxi-item>

此问题是否存在已知的解决方法?

谢谢!

2 个答案:

答案 0 :(得分:2)

作为绑定,您可以将所有按钮放在父组件内容中的模板中,然后遍历所有模板以将它们显示为内容。

App.component.html

<parent_component>
    <ng-template>
        <button> // first button </button>
    </ng-template>
    <ng-template>
        <button> // second button </button>
    </ng-template>
    <ng-template>
        <button> // third button </button>
    </ng-template>
</parent_component>

Parent.component.ts

export class ParentComponent {
  @ContentChildren(TemplateRef) templateRefs: QueryList<TemplateRef>;
}

Parent.component.html

<div *ngFor="let x of templateRefs">
  <dxi-item location='after' class="osii-item-content"> 
    <ng-container *ngTemplateOutlet="x"></ng-container>
  </dxi-item>
</div>

更好的解决方案(并非完全是您所要求的)是为按钮传递单个模板,然后传递包含按钮内容的数组。在示例中,我传递了一个字符串数组,但是它肯定可以是整个对象。

App.component.html

<parent_component [texts]=['first', 'second', 'third'>
    <ng-template let-x @BtnTemplate>
        <button> {{x}} </button>
    </ng-template>
</parent_compnent>

Parent.component.ts

export class ParentComponent {
  @Input() texts: string[];
  @ContentChild("BtnTemplate") btnTemplateRef: TemplateRef;
}

Parent.component.html

<div *ngFor="let x of texts">
  <dxi-item location='after' class="osii-item-content"> 
    <ng-container *ngTemplateOutlet="btnTemplateRef"
                  context: { $implicit: x }">
    </ng-container>
  </dxi-item>
</div>

答案 1 :(得分:0)

我想您正在寻找的东西是这样的: <ng-container *ngFor="let item of items"> <your-compo></your-compo> </ng-container> 因此,您可以遍历项目并生成所需的组件。不用担心,不会渲染ng-container,只会显示您的组件。