export class Person{
name:string,
age:number,
listAdress:Map<string,Adresses[]>
}
我需要解析每个人的所有地址
<div *ngFor="let person of persons">
<div *ngFor="let adr of person.listAdress">==> it is possible ??
</div>
如何使用地图键迭代所有地址
如果我们假设地图的键是"Fes">
Map
API 公开了一个可用于获取Address[]
的values()
方法。
数据结构有点混乱,但我会向您展示如何从人那里获取第一个Address
数组,并使用*ngFor
对其进行迭代。(*ngFor
需要一个类似数组的结构,而不仅仅是任何可迭代的结构(。
在组件类中创建一个方法,将可迭代values
转换为数组:
在组件类中:
getAddresses(person: Person): Address[] {
return Array.from(person.listAddress.values())[0];
}
在模板中:
<div *ngFor="let person of persons">
<div *ngFor="let adr of getAddresses(person)"></div>
</div>
您还可以使用 forEach()
方法循环访问每个值并将其添加到另一个数组中(同样在单独的方法中(:
在组件类中:
getAllAddresses(person: Person): Address[] {
const allAddresses: Address[] = [];
person.listAddress.forEach((value: Address[]) => {
allAddresses.push(...value);
});
return allAddresses;
}
在模板中:
<ul> All Addresses:
<li *ngFor="let adr of getAllAddresses(person)">
{{ adr.num + ' ' + adr.street }}
</li>
</ul>
下面是一个包含两个示例的工作应用程序的链接:https://stackblitz.com/edit/address-map
您不能在带有ngFOr
的Map
上循环,因为它不被视为Iterable
。
为此,您可以首先通过Array.from
或手动循环来应用转换,正如 @vincecampanale BUT 指出的那样,但这会损害您的性能,因为它会在每次更改检测时触发并运行。
如果它是一个小应用程序,很好。如果您关心性能,则应使用(纯!(管道将转换应用于ngFor
上的 Map + trackBy
。
对于管道,不需要自己做,你可以使用 ngx 管道做
<div *ngFor="let person of persons">
<div *ngFor="let adr of person.listAdress | values"></div>
</div>
对于性能更好,并避免编码不存在的内容。还添加一个 trackBy 它会很棒:)