【发布时间】:2017-05-01 18:18:52
【问题描述】:
我正在使用*ngFor 填充options 的<select></select>。我的问题是我的 6 个 <select> 中的 1 个可以有 1000 数组值。性能是痛苦的。我知道这是因为changeDetection 或One-way Binding。有没有办法更好地为<option> 实现*ngFor。我实际上不需要change detection 或one-way binding。
我的代码
<select [formControl]="requestForm.controls['SellCommodityId']">
<option [value]="" disabled selected>COMMODITY/GRADE</option>
<option [value]="item.Id" *ngFor="let item of fieldOptions?.Product;">{{item.Value}}</option>
</select>
2016 年 12 月 20 日更新
我将选择放入它的一个组件中,如下所示:
import { Component, ChangeDetectionStrategy,Input } from '@angular/core';
/**
* <ihda-select [list]="list" [control]="control" [titleOption]="title"></ihda-select>
*/
@Component({
selector:'ihda-select',
changeDetection:ChangeDetectionStrategy.OnPush,
template:`
<select [formControl]="control" class="form-control">
<option [value]="" disabled selected>{{titleOption}}</option>
<option [value]="item.Id" *ngFor="let item of list">{{item.Value}}</option>
</select>
`,
styleUrls: ['../app.component.css']
})
export class IHDASelect{
@Input() list: any[];
@Input() control: any;
@Input() titleOption: string;
}
性能问题仍然存在。
似乎不是changeDetection,因为我尝试从<select> 中删除[formControl] 属性,然后不再出现性能问题。似乎使用用于跟踪表单组的[formControl] 属性会导致性能问题。有这方面的信息吗?或者我该如何解决?
2016 年 12 月 21 日更新
这里的 plunker 中显示的性能问题:
https://plnkr.co/edit/2jNKFotBRIIytcmLto7y?p=preview
如果您点击Options Route,加载选项需要很长时间。如果您删除表单代码,则路由不会花费很长时间来加载。
【问题讨论】:
-
听起来可能值得报告错误(需要允许重现的 Plunker)
-
@GünterZöchbauer 好的,我会尝试在 plunkr 中重现错误
-
@GünterZöchbauer 我添加了一个 plunker 来显示行为
-
性能问题是如何实现的?我不知道预期的行为是什么。当我导航到选项时,会有一些延迟(大约 2 秒),我猜在启用内置输出和 prodMode 后可能会变得更快。你有没有尝试过?你试过什么浏览器?
-
只是一个想法。我试图将选项的呈现延迟到选择获得焦点时。也不完美,但也不算太差,在 prodMode 和 AoT plnkr.co/edit/KRgYHktFXHyPugS3nPQk?p=preview IE 中会快很多,所以测试应该显示最坏的情况。
标签: angular angular2-directives