You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中ngFor的else模板重复显示问题及数据获取咨询

问题解决

一、让错误模板仅显示一次

当前代码中crCreationFailTmp重复显示,是因为在*ngFor循环内部对每个value单独判断,每遇到无crId的项就渲染一次模板。要实现仅显示一次错误提示,需先过滤有效项渲染列表,再单独判断是否存在失败项,存在则一次性渲染错误模板:

修改后的模板代码

<ol class="lmn-list-group lmn-list-group-initial">
  <!-- 只循环渲染有crId的项 -->
  <ng-container *ngFor="let value of group.values.filter(v => v.crId)">
    <li class="lmn-list-group-item">
      <a [href]="value.crUrl" target="_blank" [mtTooltip]="value.crId" placement="top">
        {{ 'CR IN ' + value.crId }}
      </a>
      <div class="lmn-pb-2 bfaText">{{ value.name }}</div>
    </li>
  </ng-container>
</ol>

<!-- 判断是否存在创建失败的项,有则显示一次错误提示 -->
<ng-container *ngIf="group.values.some(v => !v.crId)">
  <p class="lmn-pl-3 lmn-text-danger">Change request creation failed</p>
</ng-container>

若想保留ng-template写法,可使用*ngTemplateOutlet:

<ol class="lmn-list-group lmn-list-group-initial">
  <ng-container *ngFor="let value of group.values.filter(v => v.crId)">
    <li class="lmn-list-group-item">
      <a [href]="value.crUrl" target="_blank" [mtTooltip]="value.crId" placement="top">
        {{ 'CR IN ' + value.crId }}
      </a>
      <div class="lmn-pb-2 bfaText">{{ value.name }}</div>
    </li>
  </ng-container>
</ol>

<ng-template #crCreationFailTmp>
  <p class="lmn-pl-3 lmn-text-danger">Change request creation failed</p>
</ng-template>

<ng-container *ngIf="group.values.some(v => !v.crId); else noFail">
  <ng-container *ngTemplateOutlet="crCreationFailTmp"></ng-container>
</ng-container>
<ng-template #noFail></ng-template>

核心逻辑:用filter筛选有crId的项渲染列表,再用some方法判断数组中是否存在无crId的项,存在则仅显示一次错误提示。

二、将*ngIf放在*ngFor之前时获取value.crId

若把*ngIf放在*ngFor前面,此时ngIf的上下文是group而非单个value,无法直接访问value.crId。这种情况下只能基于整个数组的状态做判断,比如:

  • 判断数组中是否存在有crId的项:group.values.some(v => v.crId)
  • 判断数组中所有项都有crId:group.values.every(v => v.crId)

示例代码:

<!-- 判断数组中存在至少一个有crId的项时,才渲染整个列表 -->
<ng-container *ngIf="group.values.some(v => v.crId)">
  <ol class="lmn-list-group lmn-list-group-initial">
    <ng-container *ngFor="let value of group.values">
      <li class="lmn-list-group-item">
        <a [href]="value.crUrl" target="_blank" [mtTooltip]="value.crId" placement="top">
          {{ 'CR IN ' + value.crId }}
        </a>
        <div class="lmn-pb-2 bfaText">{{ value.name }}</div>
      </li>
    </ng-container>
  </ol>
</ng-container>

如果判断逻辑必须基于单个value的crId,则*ngIf必须放在*ngFor内部,因为只有进入循环后才会生成单个value的上下文。

内容的提问来源于stack exchange,提问作者Kiara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:52:39