【问题标题】:How to apply multiple template bindings on one element in angular [duplicate]如何以角度在一个元素上应用多个模板绑定[重复]
【发布时间】:2016-11-29 20:33:00
【问题描述】:

我正在使用如下模板:

<ul [ngClass]="{dispN: !shwFilter,'list-group':true,'autoS':true,'dispB':shwFilter,'myshddw':true}" style=";display: none">
  <li *ngIf="itsNotF && itsNotF.length" [ngClass]="{bgDFF: !colps[j],'list-group-item':true}" *ngFor="let valm1 of itsNotF;let j=index;" (click)="togFltr(j)" style="padding: 0;background: #fff">
    <div *ngIf="valm1 && valm1.type=='1'">
      <h5 style="padding:8px;margin: 0;">{{valm1['header']}}</h5>
      <p style="margin: 8px;">{{valm1['body']}}</p>
      <h6 style="padding:8px;margin: 0;">{{valm1['note']}}</h6>
    </div>
    <div *ngIf="valm1 && valm1.type=='2'" (click)="modlTxt=valm1;notREadVu(j)" data-toggle="modal" data-target="#myModal">
      <h5 style="padding:8px;margin: 0;">{{valm1['header']}}</h5>
      <h6 style="padding:8px;margin: 0;">{{valm1['note']}}</h6>
    </div>
    <div *ngIf="valm1 && valm1.type=='3'">
      <h5 style="padding:8px;margin: 0;">{{valm1['header']}}</h5>
      <p style="margin: 8px;">{{valm1['body']}}</p>
      <h6 style="padding:8px;margin: 0;">{{valm1['note']}}</h6>
    </div>
  </li>
  <li [ngClass]="{bgDFF: !colps[j],'list-group-item':true,'lgOt':true}" (click)="logout()">
    <span class="title">Log Out <i class="fa fa-sign-out"></i></span>
  </li>
</ul>

所以它给出了以下错误:

EXCEPTION: Template parse errors:
Can't have multiple template bindings on one element. Use only one attribute named 'template' or prefixed with * ("one">
  <li *ngIf="itsNotF && itsNotF.length" [ngClass]="{bgDFF: !colps[j],'list-group-item':true}" [ERROR ->]*ngFor="let valm1 of itsNotF;let j=index;" (click)="togFltr(j)" style="padding: 0;background: #fff">
"): App@78:94

之前升级到 RC4 后我遇到了这个问题。

那么有什么解决方法,所以我可以在单个元素上应用多个模板绑定而不改变模板结构。

【问题讨论】:

  • ngIf & ngFor 都是结构指令,它们不能出现在同一个元素上。对于解决方法,您可以查看github issue coment
  • 但之前(RC1)它工作正常。

标签: angular angular-directive angular-template


【解决方案1】:

不能在 Angular 2 中的一个元素上使用两个模板绑定(如 *ngIf 和 *ngFor)。但是您可以通过使用 span 或任何其他元素包装元素来实现相同的目的。最好附加 &lt;ng-container&gt;,因为它是一个逻辑容器,不会附加到 DOM。例如,

<ng-container *ngIf="condition">
    <li *ngFor="let item of items">
        {{item}}
    </li>
</ng-container>

【讨论】:

  • 这个解决方案并不总是有效。例如两个 ng 容器
  • 我只是更改为添加带有 *ngIf="condition" 的 div 而不是这个 ng-container。同时,我使用 angular 6。这个改变对我有用。
【解决方案2】:

您可以使用以下(扩展版本)来保留文档结构(例如,用于您的 css 选择器):

<template [ngIf]="itsNotF && itsNotF.length">
    <div [ngClass]="{bgDFF: !colps[j],'list-group-item':true}" *ngFor="let valm1 of itsNotF;let j=index;" (click)="togFltr(j)" style="padding: 0;background: #fff">
    </div>
</template>

【讨论】:

    【解决方案3】:

    将你的 *ngIf 放在父 div 中,*ngFor 可以保持原位。

    例如:

    <div *ngIf="itsNotF && itsNotF.length">
        <div [ngClass]="{bgDFF: !colps[j],'list-group-item':true}" *ngFor="let valm1 of itsNotF;let j=index;" (click)="togFltr(j)" style="padding: 0;background: #fff">
        </div>
    </div>
    

    【讨论】:

    • 但为此我必须更改模板结构和 CSS(对应选择器)。在不改变模板结构的情况下是否有任何其他解决方法。
    • 有没有类似stackoverflow.com/questions/10700020/…的解决方案
    • 确实如此。如果它有助于您的 CSS,您可以将父级定义为跨度。甚至可以自定义元素:例如&lt;test *ngIf="1==1"&gt;&lt;div&gt;&lt;/div&gt;&lt;/test&gt;
    • 虽然有点垃圾,但一种选择是使用display:none 使div 元素不可见,然后使用*ngFor。但是,这不会像 *ngIf 那样从 DOM 中删除元素,所以它不是很好
    • 现在我更新了我的方案现在你可以理解为什么我不能使用你的解决方案了因为线路注销总是可见的并且改变 ul>li 选择器是不可能的(需要在 css 中进行大量更改)。跨度>
    【解决方案4】:

    如果您正在使用 *ngFor 并且想要添加 *ngIf 来检查某些字段,如果条件不是太复杂,我会使用过滤器,我运行我的条件并仅返回在该循环内进入我的条件的项目.. 希望对您有所帮助

    类似的东西,我只想显示带有描述的项目:

    <div class="delivery-disclaimer" *ngFor="let payment of cart.restaurant.payment_method | filter:[{short_name: cart.payment_method}] | onlyDescription" text-wrap>
            <ion-icon item-left name="information-circle"></ion-icon> {{payment.pivot.description}}
        </div>
    

    喜欢

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2019-01-13
    • 2017-04-12
    • 2023-01-30
    • 2021-09-16
    相关资源
    最近更新 更多