Angular 模板内嵌套循环的索引
Angular Index of nested loop inside Template
我在 table 中有一个嵌套循环,但我只想在 DOM 中显示有限数量的行,并在单击按钮时加载更多行。
循环看起来像这样:
<ng-container *ngFor="let organisation of organisations; let organisationIndex = index;">
<ng-container *ngFor="let department of organisation.departments; let departmentIndex = index;">
<ng-container *ngFor="let user of department.users; let userIndex = index;">
<div>
This is a List entry and i only want this 20 times in total (not for each loop)
</div>
</ng-container>
</ng-container>
</ng-container>
在不增加复杂性的情况下,在嵌套循环中获取索引的最流畅方法是什么?
我不想用 css :nth-of-type 或类似的东西来做,因为我的数据集很大而且 dom 变慢,即使元素被隐藏 css.
每个数组的长度都是动态的,这使我无法制作静态公式(如 organizationIndex * 50)。
如何处理这个问题有多种选择:
服务器预处理
Trim 服务器上的数据和发送到客户端的数据只设置您想要渲染的。优点是客户端的浏览器不必处理大量数据(并下载它们)。或者在每个用户上引入一个“totalIndex”,它在组织中是递增的和连续的。
Angular 修剪 - 子集合中的项目数量相等
如果您的子集合中的项目包含相同数量的项目。你必须乘以索引并检查你是否已经输出了 20 行。如果是这样,请使用 *ngIf
以避免显示更多。使用 *ngIf
项目时根本不会呈现。
<ng-container *ngFor="let organisation of organisations; let organisationIndex = index;">
<ng-container *ngFor="let department of organisation.departments; let departmentIndex = index;">
<ng-container *ngFor="let user of department.users; let userIndex = index;">
<div *ngIf="(organisationIndex * organisation.departments.length) + (departmentIndex * department.users.length) + userIndex < 20">
This is a List entry and i only want this 20 times
</div>
</ng-container>
</ng-container>
</ng-container>
Angular 微调 - 副管
如果子集合中的项目数不相等,请使用 counterpipe
.
import { Pipe, PipeTransform } from '@angular/core';
import { Counter } from './counter';
const counters = new WeakMap<any, Counter>();
@Pipe({
name: 'counterPipe'
})
export class CounterPipe implements PipeTransform {
transform(value: any): Counter {
if (!counters.has(value)) {
counters.set(value, new Counter());
}
return counters.get(value);
}
}
这将在处理 *ngFor
中的实体时添加计数器,因此您始终知道正在渲染的元素数量。
用这个管道包装你的代码:
<ng-container *ngFor="let counter of [organisations | counterPipe]">
<ng-container *ngFor="let organisation of organisations; let organisationIndex = index;">
<ng-container *ngFor="let department of organisation.departments; let departmentIndex = index;">
<ng-container *ngFor="let user of department.users; let userIndex = index;">
<div *ngIf="counter.inc() < 20">
This is a List entry and i only want this 20 times
</div>
</ng-container>
</ng-container>
</ng-container>
</ng-container>
用法示例见https://stackblitz.com/edit/angular-nested-ngfor-ydvxjv
我在 table 中有一个嵌套循环,但我只想在 DOM 中显示有限数量的行,并在单击按钮时加载更多行。
循环看起来像这样:
<ng-container *ngFor="let organisation of organisations; let organisationIndex = index;">
<ng-container *ngFor="let department of organisation.departments; let departmentIndex = index;">
<ng-container *ngFor="let user of department.users; let userIndex = index;">
<div>
This is a List entry and i only want this 20 times in total (not for each loop)
</div>
</ng-container>
</ng-container>
</ng-container>
在不增加复杂性的情况下,在嵌套循环中获取索引的最流畅方法是什么?
我不想用 css :nth-of-type 或类似的东西来做,因为我的数据集很大而且 dom 变慢,即使元素被隐藏 css.
每个数组的长度都是动态的,这使我无法制作静态公式(如 organizationIndex * 50)。
如何处理这个问题有多种选择:
服务器预处理 Trim 服务器上的数据和发送到客户端的数据只设置您想要渲染的。优点是客户端的浏览器不必处理大量数据(并下载它们)。或者在每个用户上引入一个“totalIndex”,它在组织中是递增的和连续的。
Angular 修剪 - 子集合中的项目数量相等
如果您的子集合中的项目包含相同数量的项目。你必须乘以索引并检查你是否已经输出了 20 行。如果是这样,请使用 *ngIf
以避免显示更多。使用 *ngIf
项目时根本不会呈现。
<ng-container *ngFor="let organisation of organisations; let organisationIndex = index;">
<ng-container *ngFor="let department of organisation.departments; let departmentIndex = index;">
<ng-container *ngFor="let user of department.users; let userIndex = index;">
<div *ngIf="(organisationIndex * organisation.departments.length) + (departmentIndex * department.users.length) + userIndex < 20">
This is a List entry and i only want this 20 times
</div>
</ng-container>
</ng-container>
</ng-container>
Angular 微调 - 副管
如果子集合中的项目数不相等,请使用 counterpipe
.
import { Pipe, PipeTransform } from '@angular/core';
import { Counter } from './counter';
const counters = new WeakMap<any, Counter>();
@Pipe({
name: 'counterPipe'
})
export class CounterPipe implements PipeTransform {
transform(value: any): Counter {
if (!counters.has(value)) {
counters.set(value, new Counter());
}
return counters.get(value);
}
}
这将在处理 *ngFor
中的实体时添加计数器,因此您始终知道正在渲染的元素数量。
用这个管道包装你的代码:
<ng-container *ngFor="let counter of [organisations | counterPipe]">
<ng-container *ngFor="let organisation of organisations; let organisationIndex = index;">
<ng-container *ngFor="let department of organisation.departments; let departmentIndex = index;">
<ng-container *ngFor="let user of department.users; let userIndex = index;">
<div *ngIf="counter.inc() < 20">
This is a List entry and i only want this 20 times
</div>
</ng-container>
</ng-container>
</ng-container>
</ng-container>
用法示例见https://stackblitz.com/edit/angular-nested-ngfor-ydvxjv