假设我有我要显示的人员列表。在下面的*ngFor
循环中,您将看到此迭代的HTML。您可以查看this StackBlitz来查看完整的示例。
<mat-list role="list">
<mat-list-item *ngFor="let name of names" role="listitem">
<mat-icon mat-list-icon>person</mat-icon>
<h4 mat-line>{{name.firstName}}</h4>
</mat-list-item>
</mat-list>
在某些情况下,该列表应显示为链接列表,因为此人列表随后链接到其他网页。我可以做的是编写一个*ngIf
来检查它应该是链表还是普通列表,如下所述。
<div *ngIf="isNormalList; else isLinkedList">
<h3>Normal list with items</h3>
<mat-list role="list">
<mat-list-item *ngFor="let name of names" role="listitem">
<mat-icon mat-list-icon>person</mat-icon>
<h4 mat-line>{{name.firstName}}</h4>
</mat-list-item>
</mat-list>
</div>
<ng-template #isLinkedList>
<h3>List with clickable items</h3>
<mat-list role="list">
<a mat-list-item href="#" *ngFor="let name of names" role="listitem">
<mat-icon mat-list-icon>person</mat-icon>
<h4 mat-line>{{name.firstName}}</h4>
</a>
</mat-list>
</ng-template>
但是,以这种方式解决它似乎有很多重复的代码。我还可以为列表项的内部写一个*ngIf
,但这大致相同,并且最终也会出现重复的代码。
是否有一种方法只能在此设置中有条件地添加a
元素?
答案 0 :(得分:1)
我认为可以在节省行和保持可读性之间找到平衡,我认为尝试确保绝对没有代码重复可能会变得很复杂。
简单易读。
<div>
<h3>List with clickable items</h3>
<mat-list role="list">
<div *ngFor="let name of names">
<a *ngIf="name.link" mat-list-item href="#" role="listitem">
<mat-icon mat-list-icon>person</mat-icon>
<h4 mat-line>{{name.firstName}}</h4>
</a>
<div *ngIf="!name.link">
<mat-icon mat-list-icon>person</mat-icon>
<h4 mat-line>{{name.firstName}}</h4>
</div>
</div>
</mat-list>
</div>
这将重复以下操作,并添加两个新的<div>
标签。
<mat-icon mat-list-icon>person</mat-icon>
<h4 mat-line>{{name.firstName}}</h4>
这是我能想到的最不重复的方式,而不会做一些怪异的事情,例如将<a>
扩展到mat-icon
和h4
上,并且使用CSS(如果存在)。这不愉快或不可读。
答案 1 :(得分:1)
类似的东西应该起作用。我认为您可以在使用context
来缩短$implicit
位的情况下缩短它的长度,但是不确定如何精确地检查角度文档。
在旁注中,我认为您不需要指定role
属性,材料应为您提供这些属性。
<div>
<mat-list role="list">
<ng-container *ngIf="isNormalList; else isLinkedList">
<mat-list-item *ngFor="let name of names" role="listitem">
<ng-container *ngTemplateOutlet="listItem; context: { $implicit: name }"></ng-container>
</mat-list-item>
</ng-container>
<ng-template #isLinkedList>
<a mat-list-item href="#" *ngFor="let name of names" role="listitem">
<ng-container *ngTemplateOutlet="listItem; context: { $implicit: name }"></ng-container>
</a>
</ng-template>
</mat-list>
</div>
<ng-template #listItem let-name>
<mat-icon mat-list-icon>person</mat-icon>
<h4 mat-line>{{name.firstName}}</h4>
</ng-template>
答案 2 :(得分:0)
您可以将*ngFor
放在ng-template
标签上:
<ng-template ngFor [ngForOf]="items" let-item>
<div *ngIf="!item.link" class="card">
<h4>Card Info:</h4>
<p>ID: {{ item.id }}</p>
<p>
Title: {{ item.title }}
</p>
</div>
<a *ngIf="item.link" href="{{ item.link }}" class="card">
<h4>Card Info:</h4>
<p>ID: {{ item.id }}</p>
<p>
Title: {{ item.title }}
</p>
</a>
</ng-template>