我有一组记录显示,而不是隐藏,我想使用*ngIf,但如果我写*ngIf它说error不能在同一元素上使用ngIf和ngFor。
<scx-indv-supplier
class="row"
*ngFor="let request of suppliers"
[hidden]="request.status === 'CANCELLED' && request.durationDays > 179"
[request]="request"
[requestId]="request.requestId"
>
</scx-indv-supplier>
但是,如果在scx-indv供应商的顶部使用div,并这样写。它引发错误无法读取未定义的属性"status">
<div *ngIf="request.status != 'CANCELLED' && request.durationDays > 179">
<scx-indv-supplier
class="row"
*ngFor="let request of suppliers"
[request]="request"
[requestId]="request.requestId"
></scx-indv-supplier>
</div>
答案发布在有关结构指令的官方文件中
有一天你会想重复一个HTML块,但只有当特定条件成立。您将尝试将*ngFor和*ngIf在同一主机元素上。Angular不会让你。一个图元只能应用一个结构指令。
原因很简单。结构指令可以做复杂的事情与宿主元素及其后代一起。当有两个指令时对同一宿主元素的声明,哪一个优先?哪一个应该先去,NgIf还是NgFor?NgIf可以取消效果吗NgFor?如果是这样(而且似乎应该是这样(,应该如何Angular概括了对其他结构进行抵消的能力指令?
这些问题没有简单的答案。禁止多个结构性指令使它们变得毫无意义。有一个简单的解决方案这个用例:将*ngIf放在包装*ngFor元素。一个或两个元素都可以是ng容器,这样就不必引入额外级别的HTML。
你可以在这里使用ng容器标签,就像下面的一样
<ng-container *ngFor="let request of suppliers" >
<div>
<scx-indv-supplier
class="row"
*ngIf="request.status != 'CANCELLED' && request.durationDays > 179"
[request]="request"
[requestId]="request.requestId"
></scx-indv-supplier>
</div>
</ng-container>
由于无法引用,您请求循环范围外部的变量
如果我没记错,错误也会"告诉"您解决方案是什么。
在这种情况下,必须使用ng-template
包装*ngFor
:
<ng-template *ngFor="let request of suppliers"
<scx-indv-supplier
class="row"
[hidden]="request.status === 'CANCELLED' && request.durationDays > 179"
[request]="request"
[requestId]="request.requestId"
>
</scx-indv-supplier>
</ng-template>