Jam*_*ney 0 javascript typescript angular
当ngFor应该呈现7600个字符串项时,性能非常慢,浏览器会冻结几秒钟.
是否有可能提高ngFor的性能?
ng代码:
<ul *ngIf="isOpen"
class="nano-drop-down-list"
dropdownMenu>
<li class="nano-f-r nano-f-30">
<input [(ngModel)]="searchString"
class="nano-f nano-p-0_10 nano-bc-ws hover-effect"
placeholder="Search..." type="text"/>
</li>
<!-- ngFor which should be improved -->
<li *ngFor="let option of arrayOfOptions | nanoSearchByKey:searchString:displayProperty;"
[ngClass]="{'active':isOptionSelected(option[valueProperty])}"
class="nano-f-r nano-f-30 nano-bc-ws hover-effect">
<button (click)="handleClickOnOption(option[valueProperty]);"
type="button"
class="nano-f-c nano-f nano-p-0_10 nano-overflow-h">
<div class="nano-f-r nano-f">
<span class="nano-m-aaa0 nano-overflow-e">
{{ option[displayProperty] }}
</span>
<div *ngIf="isMultiple"
class="nano-f-r nano-f-30">
<i *ngIf="isOptionSelected(option[valueProperty])"
class="fa fa-check nano-m-a"
aria-hidden="true"></i>
</div>
</div>
</button>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
NgForOf在Angular 6中提供了覆盖track by函数(源)的选项.它允许您选择角度应检查更改的属性/条件.
为此,只需向组件添加一个方法,如下所示:
trackByFn(index, item) {
return item.someUniqueIdentifier;
// or if you have no unique identifier:
// return index;
}
Run Code Online (Sandbox Code Playgroud)
而在您的组件HTML中,您将循环更改为
<li *ngFor="let option of arrayOfOptions | nanoSearchByKey:searchString:displayProperty; trackBy: trackByFn"
[ngClass]="{'active':isOptionSelected(option[valueProperty])}"
class="nano-f-r nano-f-30 nano-bc-ws hover-effect">
Run Code Online (Sandbox Code Playgroud)
Angular会自动将当前索引以及当前项传递给函数.
这是一个很好的帖子,有更具体的例子和更多信息(感谢@Pedro Arantes).