#javascript #angular
#javascript #angular
Вопрос:
У меня есть этот шаблон angular2:
<template *ngIf="alerts.length > 0">
<alert *ngFor="let alert of alerts;let i = index" [type]="alert.type" dismissible="true" (close)="closeAlert(i)">
{{ alert?.msg }}
</alert>
</template>
Я получаю эти ошибки:
zone.js:461 Unhandled Promise rejection: Template parse errors:
Can't have multiple template bindings on one element. Use only one attribute named 'template' or prefixed with * (" </div>
<div *ngSwitchCase="false" class="container p-t-10">
<alert *ngIf="alerts.length > 0" [ERROR ->]*ngFor="let alert of alerts;let i = index" [type]="alert.type" dismissible="true" (close)="closeAlert"): b@5:37
в чем проблема, я помещаю * ngIf и * ngFor в разные элементы html. Это должно сработать. нет?
и:
Can't bind to 'type' since it isn't a known property of 'alert'. (""container p-t-10">
<alert *ngIf="alerts.length > 0" *ngFor="let alert of alerts;let i = index" [ERROR ->][type]="alert.type" dismissible="true" (close)="closeAlert(i)">
{{ alert?.msg }}
</alert>
"): b@5:80
Я добавил
*ngIf="alerts.length > 0
чтобы избежать случаев alert = []
. Как я могу это исправить иначе?
Комментарии:
1. попробуйте с
attr.type
вместо типа simple
Ответ №1:
*
В *ngFor
позволяет Angular добавлять <template>
тег. В <template>
теге это не имеет смысла, и поэтому здесь структурные директивы имеют другой синтаксис.
<template ngFor [ngForOf]="alerts" let-alert let-i="index">
Поскольку разный синтаксис для почти одного и того же в разных местах вызвал некоторую путаницу, команда Angular недавно представила
<ng-container>
это похоже на <template>
тег (не добавляется в DOM), но допускает более общий синтаксис
<ng-container *ngIf="alerts.length > 0">
<alert *ngFor="let alert of alerts;let i = index" [type]="alert.type" dismissible="true" (close)="closeAlert(i)">
{{ alert?.msg }}
</alert>
</ng-container>
Комментарии:
1. эта проверка пустого массива также исправит
Can't bind to 'type' since it isn't a known property of 'alert'
?2. все еще получаю эту ошибку:
Can't bind to 'type' since it isn't a known property of 'alert'. (" <ng-container *ngIf="alerts.length > 0"> <alert *ngFor="let alert of alerts;let i = index" [ERROR ->][type]="alert.type" dismissible="true" (close)="closeAlert(i)"> {{ alert?.msg }} </alert> "): b@6:54
3. Вероятно, вам не хватает импорта или объявления в,
@NgModule({imports: [ModuleThatContainsAlert], declaration: [AlertComponent])
зависимости от того, откуда<alert>
поступает. Сообщение об ошибке указывает на то, что для этого элемента неAlertComponent
создан экземпляр.4.
public alerts:Array<Object> = [];
является членом клуба. Я думал, ошибка в том, что массив был пуст в начале. думал, что * ngIf должен исправить это5. Это потому, что
<alert [type]=xxx
потому что<alert>
не имеет собственностиtype
.
Ответ №2:
Вы должны использовать <ng-container>
для этого случая. В качестве примера:
<ng-container *ngIf="totalItems > 0">
<tr *ngFor="let item of outputs| paginate: { id:'ab', itemsPerPage: pageSize, currentPage: currentPage, totalItems: totalItems }; let $index = index">
<td>{{item.x}}</td>
<td>{{item.y | date: 'MMMM d, y, h:mm:ss a' }}</td>
<td>{{item.z}}</td>
<td>{{item.r}}</td>
</tr>
</ng-container>
<ng-container *ngIf="totalItems > 10">
<tr *ngFor="let item of outputs| paginate: { id:'aabbbbbbbbb', itemsPerPage: pageSize, currentPage: currentPage, totalItems: totalItems }; let $index = index">
<td>{{item.x}}</td>
<td>{{item.y | date: 'MMMM d, y, h:mm:ss a' }}</td>
<td>{{item.z}}</td>
<td>{{item.r}}</td>
</tr>
</ng-container>