Angular 2:在 ngFor 中使用 ngIf 不起作用
Angular 2: Using ngIf inside ngFor not working
我有以下 ngFor
循环:
<div *ngFor="let variety of varieties; let i=index">
<div class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
打印出以下内容:
Greens
Greens
Greens
Fruits
我希望它不重复打印,所以(在这种情况下)我希望它打印出来:
Greens
Fruits
VarietyTypeNames
总是会在数组中组合在一起,所以如果有多个Greens,他们总是一个接一个地来。我可以只在循环内部使用 ngIf
并且基本上只是告诉它只显示 VarietyTypeName
如果它不等于之前的 VarietyTypeName
?
我尝试在下面实现该逻辑,但出现错误。我做错了什么?
<div *ngFor="let variety of varieties; let i=index">
<div *ngIf="variety[i].VarietyTypeName != variety[i - 1].VarietyTypeName" class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
错误信息如下:
Cannot read property 'VarietyTypeName' of undefined
我猜应该是
<div *ngFor="let variety of varieties; let i=index">
<div *ngIf="variety.VarietyTypeName != i == 0 ? 0 : varieties[i - 1].VarietyTypeName" class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
试试这个
<div *ngFor="let variety of varieties; let i=index">
<div *ngIf="variety.VarietyTypeName != varieties[i - 1]?.VarietyTypeName" class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
你应该在你的控制器中执行那种逻辑。
从数组中过滤所有重复项,然后简单地对其进行迭代。
let filteredVarieties = varieties.filter((variety, index) {
return varieties.indexOf(variety) == index;
});
现在您可以 *ngFor
覆盖新创建的 filteredVarieties
在这种情况下,您可能希望在迭代之前使用管道过滤值。我将演示一个可能有用的简单管道。
N.B 我将使用库 lodash
来简化示例。
import { Pipe, PipeTransform } from '@angular/core';
import * as _ from 'lodash';
@Pipe({
name: 'filter'
})
class FilterPipe {
transform(input: any, term: any) {
return _.uniqBy(input, term)
}
}
像在 angular 2 中一样导入管道后,这就是您的模板代码
<div *ngFor="let variety of varieties | filter : 'VarietyTypeName' ">
{{variety.VarietyTypeName}}
</div
P.S记得将 lodash 添加到您的供应商文件中。
我有以下 ngFor
循环:
<div *ngFor="let variety of varieties; let i=index">
<div class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
打印出以下内容:
Greens
Greens
Greens
Fruits
我希望它不重复打印,所以(在这种情况下)我希望它打印出来:
Greens
Fruits
VarietyTypeNames
总是会在数组中组合在一起,所以如果有多个Greens,他们总是一个接一个地来。我可以只在循环内部使用 ngIf
并且基本上只是告诉它只显示 VarietyTypeName
如果它不等于之前的 VarietyTypeName
?
我尝试在下面实现该逻辑,但出现错误。我做错了什么?
<div *ngFor="let variety of varieties; let i=index">
<div *ngIf="variety[i].VarietyTypeName != variety[i - 1].VarietyTypeName" class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
错误信息如下:
Cannot read property 'VarietyTypeName' of undefined
我猜应该是
<div *ngFor="let variety of varieties; let i=index">
<div *ngIf="variety.VarietyTypeName != i == 0 ? 0 : varieties[i - 1].VarietyTypeName" class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
试试这个
<div *ngFor="let variety of varieties; let i=index">
<div *ngIf="variety.VarietyTypeName != varieties[i - 1]?.VarietyTypeName" class="varietyTypeName">
{{variety.VarietyTypeName}}
</div>
</div
你应该在你的控制器中执行那种逻辑。
从数组中过滤所有重复项,然后简单地对其进行迭代。
let filteredVarieties = varieties.filter((variety, index) {
return varieties.indexOf(variety) == index;
});
现在您可以 *ngFor
覆盖新创建的 filteredVarieties
在这种情况下,您可能希望在迭代之前使用管道过滤值。我将演示一个可能有用的简单管道。
N.B 我将使用库 lodash
来简化示例。
import { Pipe, PipeTransform } from '@angular/core';
import * as _ from 'lodash';
@Pipe({
name: 'filter'
})
class FilterPipe {
transform(input: any, term: any) {
return _.uniqBy(input, term)
}
}
像在 angular 2 中一样导入管道后,这就是您的模板代码
<div *ngFor="let variety of varieties | filter : 'VarietyTypeName' ">
{{variety.VarietyTypeName}}
</div
P.S记得将 lodash 添加到您的供应商文件中。