将变量传递给 ng-content

TKD*_*Dev 10 angular angular5 angular6

如何将 ngFor 变量传递给 ng-content 模板。

例如,包含组件:

<ul>
    <li *ngFor="let item of itemsArray">
       <ng-content></ng-content>
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

嵌套的内容组件:

<div>
    <span *ngIf="item.type_one"></span>
    <span *ngIf="item.type_two"></span>
</div>
Run Code Online (Sandbox Code Playgroud)

例如,两者:

<containing-component>
    <content-component>
    </content-component>
</containing-component>
Run Code Online (Sandbox Code Playgroud)

hgi*_*sac 13

您不能ng-content用作动态模板。使用ng-template替代

<ul>
    <li *ngFor="let item of itemsArray">
       <ng-container *ngTemplateOutlet="itemTemplate; context: { $implicit: item  }">
       </ng-container>
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)
export class ContainingComponent {

  ...

  @ContentChild(TemplateRef, {static: true}) 
  @Input() itemTemplate: TemplateRef<any>;
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以将动态模板引用到containing-component. 在这种情况下,您可以将 ng-template 包装在content-component

<containing-component [itemTemplate]="itemTmpl">
</containing-component>

<ng-template #itemTmpl let-data>

    <content-component
      [item]="data">
    </content-component>
</ng-template>
Run Code Online (Sandbox Code Playgroud)

或使用ng-template directly

<containing-component 
   [itemTemplate]="itemTmpl"
   [itemArray]="items">
</containing-component>

<ng-template #itemTmpl let-data>
  <div>
    <span *ngIf="data.type_one"></span>
    <span *ngIf="data.type_two"></span>
  </div>
</ng-template>
Run Code Online (Sandbox Code Playgroud)

  • 您可以删除@contentchild。您在这里没有使用任何内容作为 ngcontent。尝试看看:) (2认同)