首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角7 FormArray渲染性能

角7 FormArray渲染性能
EN

Stack Overflow用户
提问于 2018-11-18 13:48:50
回答 1查看 2K关注 0票数 1

我目前正在工作的角度组件,以渲染和修改发票。要编辑行项,我使用带有行项窗体的FormGroup:

代码语言:javascript
复制
lineItemForm: FormGroup = this.formBuilder.group({
    lineItems: this.formBuilder.array([])
});

当通过@Input将行项设置为组件时,将为每个行项创建FormGroup

代码语言:javascript
复制
set lineItems(lineItems: InvoiceLineItem[]) {
    this.lineItemForm.controls['lineItems'] = this.formBuilder.array(
        lineItems.map(lineItem => {
            return this.createLineItemForm(lineItem);
        })
    );
    this._lineItems = lineItems;
}

private createLineItemForm(lineItem: InvoiceLineItem): FormGroup {
    return this.formBuilder.group({
        _id: [lineItem._id],
        number: [lineItem.number],
        amount: [lineItem.amount, Validators.compose([Validators.required, NumberValidator.validateNumber(2)])],
        title: [lineItem.title],
        netprice: [lineItem.netprice, Validators.compose([Validators.required, PriceValidator.validatePrice()])],
        netpriceTotal: [lineItem.netpriceTotal, Validators.compose([Validators.required, PriceValidator.validatePrice()])],
        grosspriceTotal: [lineItem.grosspriceTotal],
        taxrate: [lineItem.taxrate, Validators.compose([Validators.required, IntegerValidator.validateInteger()])],
        taxTotal: [lineItem.taxTotal],
        from: [lineItem.from, DateValidator.validateDate('DD.MM.YYYY HH:mm')],
        to: [lineItem.to, DateValidator.validateDate('DD.MM.YYYY HH:mm')],
        pageIndex: [],
        rowOrder: []
    });
}

模板代码看起来如下(简化):

代码语言:javascript
复制
<div formArrayName="lineItems"
     *ngFor="let lineItem of lineItemForm.controls['lineItems'].controls; trackBy:getLineItemIdentity; let i = index; let even = odd">
  <div *ngFor="let column of alwaysVisibleColumns; trackBy:getColumnIdentity; let col = index; let f = first; let l = last;"
         [formGroupName]="i">
    <div [formControlName]="column.field" some-custom-directives...></div>
  </div>
</div>

我知道我正在使用div作为formControls (有自定义指令将它们用作内容可编辑的输入)

当有< 10行项目时,没有任何问题。不幸的是,呈现过程将阻塞UI大约10s (!)当发票上有30到40条线时--这绝对是荒谬的。

我很确定问题完全在于单个formControls的呈现。当我移除它们,只显示纯文本时,渲染速度会快得多。

那么,在我这一边,我还有什么可以改进的吗?还是我必须等到有角的球队来改进它?或者,对于我的场景,它永远不会有用,我必须想出其他的解决方案吗?

这里是火狐开发工具创建的性能度量的链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-22 14:21:33

经过几个小时的调查和调试,我得出结论,性能问题来自多个指令的组合。

FormControl本身并不对我所经历的延迟负责。相反,我发现对Renderer(2)的调用使事情变得非常缓慢。与其他一些或多或少繁重的计算一起,导致了这种行为。我只是没想到像".addClass“这样的东西会花费大约400毫秒的渲染时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53361597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档