【问题标题】:Loading mat accordion dynamically动态加载垫手风琴
【发布时间】:2019-07-18 17:55:25
【问题描述】:

基于 JSON 结构,我想渲染手风琴。下面是它的样子。

const area = [{
  type: 'column',
  text: ''
}, {
  type: 'accordion-item',
  text: 'accordion-item 1'
},
{
  type: 'accordion-item',
  text: 'accordion-item 2'
},
{
  type: 'accordion-item',
  text: 'accordion-item 3'
},
{
  type: 'column',
  text: ''
}]

所以我的组件html是这样的,

 <ng-container *ngFor="let area of areas">
  <ng-container *ngIf="area.type === 'accordion-item'; else section">
    <mat-accordion>
      <accordion-item [item]="area"></accordion-item>
    </mat-accordion>
  </ng-container>
  <ng-template #section></ng-template>
</ng-container>

手风琴项组件

<mat-expansion-panel>
    <mat-expansion-panel-header>
        <mat-panel-title>
             {{title}}
        </mat-panel-title>
    </mat-expansion-panel-header>
</mat-expansion-panel>

我可以加载手风琴组件。但问题是本机功能无法按预期工作。

因为对于每个accordion-item,我都会再次加载这个标签&lt;mat-accordion&gt;

那么如何避免这种情况呢?请帮忙


更新。

实施方案后,我的模板是这样的

<mat-accordion>
  <ng-container *ngFor="let area of areas" *ngTemplateOutlet="section; context:area">
    <accordion-item *ngIf="area.type === 'accordion-item'; else section" [item]="area">
    </accordion-item>
  </ng-container>
</mat-accordion>

<ng-template #section let-name="name">
  <area-template [area]="area" class="{{ area.type }}">
  </area-template>
</ng-template>

它抛出模板阶段错误。请帮忙

【问题讨论】:

  • areas的样本数据?或者您可以与 StackBlitz 共享代码
  • 添加了区域的示例数据
  • 预期输出和&lt;accordion-item&gt;的代码在哪里
  • 所以把mat-accordion移出ngFor..
  • 移出 for 循环现在手风琴正在工作,但其他内容不显示

标签: angular typescript angular-material


【解决方案1】:
<mat-accordion>
   <ng-container *ngFor="let area of areas" >
      <accordion-item *ngIf="area.type === 'accordion-item'"  [item]="area"></accordion-item>
   </ng-container>
</mat-accordion>

<ng-container *ngFor="let area of areas" #section>
   <ng-container *ngIf="!area.type === 'accordion-item'" #section>
      YOUR TEMPLATE
   </ng-container >
</ng-container >

【讨论】:

  • 手风琴似乎正在工作,但 &lt;ng-template #section&gt; &lt;template [area]="area" class="{{ area.type }}"&gt; &lt;/area-template&gt; &lt;/ng-template&gt; 它在区域模板中未定义 area 时抛出错误
  • 我已经实现了,但是它会抛出模板阶段错误。我已经更新了我的问题
  • 你已经添加了 let-name="name",也就是说,对于这种特殊情况,你必须为你想要的属性更改名称
  • @user007 我已经编辑了答案,因此它不再使用 ng-template,因为我想除了手风琴内的手风琴项目之外,您不想要任何东西。只做两个循环就更简单了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2020-05-13
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多