我怎样才能限制 ngFor 重复的一些项目的角度?

我的准则:

<li *ngFor="let item of list; let i=index" class="dropdown-item" (click)="onClick(item)">
<template [ngIf]="i<11">{{item.text}}</template>
</li>

我试图在任何时候只显示10个列表元素。正如在 回答我中建议的那样,我使用了 ngIf,但这会导致页面上出现空列表项(超过10个)。

199964 次浏览

这对我来说简单多了

<li *ngFor="let item of list | slice:0:10; let i=index" class="dropdown-item" (click)="onClick(item)">\{\{item.text}}</li>

接近你的位置

<ng-container *ngFor="let item of list; i as index">
<li class="dropdown-item" (click)="onClick(item)" *ngIf="i<11">\{\{item.text}}</li>
</ng-container>

另一种选择

<ng-template ngFor let-item [ngForOf]="list" let-i="index">
<li class="dropdown-item" (click)="onClick(item)" *ngIf="i<11">\{\{item.text}}</li>
</ng-template>

这种方法非常有效:

<template *ngFor="let item of items; let i=index" >
<ion-slide *ngIf="i<5" >
<img [src]="item.ItemPic">
</ion-slide>
</template>

除了@Gunter 的回答之外,您还可以使用 TrackBy来提高性能。TrackBy 接受一个具有两个参数的函数: index 和 item。可以从函数返回对象中的唯一值。它将停止重新呈现 ngFor 中已显示的项。在 html 中添加 trackBy,如下所示。

<li *ngFor="let item of list; trackBy: trackByFn;let i=index" class="dropdown-item" (click)="onClick(item)">
<template [ngIf]="i<11">\{\{item.text}}</template>
</li>

然后在.ts 文件中写一个这样的函数。

trackByfn(index, item) {
return item.uniqueValue;
}

您可以直接将 slice()应用到变量

<li *ngFor="let item of list.slice(0, 10);">
\{\{item.text}}
</li>

Html

<table class="table border">
<thead>
<tr>
<ng-container *ngFor="let column of columns; let i = index">
<th>\{\{ column }}</th>
</ng-container>
</tr>
</thead>
<tbody>
<tr *ngFor="let row of groups;let i = index">
<td>\{\{row.name}}</td>
<td>\{\{row.items}}</td>
<td >
<span class="status" *ngFor="let item of row.Status | slice:0:2;let j = index">
\{\{item.name}}
</span><span *ngIf = "i < 2" class="dots" (mouseenter) ="onHover(i)" (mouseleave) ="onHover(-1)">.....</span> <span [hidden] ="test" *ngIf = "i == hoverIndex" class="hover-details"><span  *ngFor="let item of row.Status;let j = index">
\{\{item.name}}
</span></span>
</td>


</tr>
</tbody>
</table>


<p *ngFor="let group of usersg"><input type="checkbox" [checked]="isChecked(group.id)" value="\{\{group.id}}" />\{\{group.name}}</p>


<p><select [(ngModel)]="usersr_selected.id">
<option *ngFor="let role of usersr" value="\{\{role.id}}">\{\{role.name}}</option>
</select></p>

打印稿

import { Component, OnInit } from '@angular/core';
import { CommonserviceService } from './../utilities/services/commonservice.service';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
getListData: any;
dataGroup: FormGroup;
selectedGroups: string[];
submitted = false;
usersg_checked:any;
usersr_selected:any;
dotsh:any;
hoverIndex:number = -1;
groups:any;
test:any;
constructor(private formBuilder: FormBuilder) {




}
onHover(i:number){
this.hoverIndex = i;
}
columns = ["name", "Items","status"];


public usersr = [{
"id": 1,
"name": "test1"


}, {
"id": 2,
"name": "test2",


}];




ngOnInit() {
this.test = false;
this.groups=[{
"id": 1,
"name": "pencils",
"items": "red pencil",
"Status": [{
"id": 1,
"name": "green"
}, {
"id": 2,
"name": "red"
}, {
"id": 3,
"name": "yellow"
}],
"loc": [{
"id": 1,
"name": "loc 1"
}, {
"id": 2,
"name": "loc 2"
}, {
"id": 3,
"name": "loc 3"
}]
},
{
"id": 2,
"name": "rubbers",
"items": "big rubber",
"Status": [{
"id": 1,
"name": "green"
}, {
"id": 2,
"name": "red"
}],
"loc": [{
"id": 1,
"name": "loc 2"
}, {
"id": 2,
"name": "loc 3"
}]
},
{
"id": 3,
"name": "rubbers1",
"items": "big rubber1",
"Status": [{
"id": 1,
"name": "green"
}],
"loc": [{
"id": 1,
"name": "loc 2"
}, {
"id": 2,
"name": "loc 3"
}]
}


];


this.dotsh = false;


console.log(this.groups.length);


this.usersg_checked = [{
"id": 1,
"name": "test1"


}, {
"id": 2,
"name": "test2",


}];


this.usersr_selected = {"id":1,"name":"test2"};;


this.selectedGroups = [];
this.dataGroup = this.formBuilder.group({
email: ['', Validators.required]
});
}


isChecked(id) {
console.log(this.usersg_checked);
return this.usersg_checked.some(item => item.id === id);
}
get f() { return this.dataGroup.controls; }
onCheckChange(event) {
if (event.target.checked) {
this.selectedGroups.push(event.target.value);
} else {
const index = this.selectedGroups.findIndex(item => item === event.target.value);
if (index !== -1) {
this.selectedGroups.splice(index, 1);
}
}
}


getFormData(value){
this.submitted = true;


// stop here if form is invalid
if (this.dataGroup.invalid) {
return;
}
value['groups'] = this.selectedGroups;
console.log(value);
}




}

CSS

.status{
border: 1px solid;
border-radius: 4px;
padding: 0px 10px;
margin-right: 10px;
}
.hover-details{
position: absolute;




border: 1px solid;
padding: 10px;
width: 164px;
text-align: left;
border-radius: 4px;
}
.dots{
position:relative;
}

例如,假设我们只想显示一个数组的前10个项,我们可以使用 切片管这样做:

<ul>
<li *ngFor="let item of items | slice:0:10">
\{\{ item }}
</li>
</ul>
 <div *ngFor="let item of list;trackBy: trackByFunc" >
\{\{item.value}}
</div>

在你的文件里

 trackByFunc(index, item){
return item ? item.id : undefined;
}

我发现以下是一个很好的方法

<ul class="list-group col-auto" *ngFor="let result of searchResults.slice(0,10)">
<li class="list-group-item">
<b>\{\{result.name}}</b>
<p>\{\{result.email}}</p>
<p>\{\{result.body | slice:0:64}}</p>
</li>
</ul>

可以通过应用三元运算符动态限制 *ngFor

例子一 -

<div *ngFor="let item of (showAllFlag ? list : list.slice(0,2))" >
</div>