Как применить несколько шаблонных привязок к одному элементу в угловых
Я использую шаблон, как показано ниже:
<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">
"): [email protected]:94
Раньше он не выдавал ошибку. Я столкнулся с этой проблемой после обновления до RC4.
Итак, какое обходное решение, поэтому я могу применить множественную привязку шаблона к одному элементу без изменения структуры шаблона.
Ответы
Ответ 1
Нельзя использовать привязку двух шаблонов для одного элемента в Angular 2 (например, * ngIf и * ngFor). Но вы можете добиться того же, обернув элемент пролетом или любым другим элементом. Хорошо добавить с помощью <ng-container>
, поскольку это логический контейнер, и он не будет добавлен в DOM. Например,
<ng-container *ngIf="condition">
<li *ngFor="let item of items">
{{item}}
</li>
</ng-container>
Ответ 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>
Ответ 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>
Давор