Angular 7 FormArray渲染性能

时间:2018-11-18 13:48:51

标签: angular typescript angular-reactive-forms angular7

我目前正在研究角度组件以渲染和修改发票。要编辑订单项,我将FormGroup与订单项Forms的FormArray一起使用:

lineItemForm: FormGroup = this.formBuilder.group({
    lineItems: this.formBuilder.array([])
});

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

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: []
    });
}

模板代码如下(简化):

<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>

我知道我将divs用作 formControls (具有自定义指令,可将它们用作内容可编辑的输入)

当有<10个订单项时,没有任何问题。不幸的是,当发票上有30-40个订单项时,呈现过程会阻塞UI约10s(!!!!!!),这绝对是荒谬的。

我很确定问题完全出在单个formControls的呈现上。当我删除它们并仅显示纯文本时,它将更快地呈现。

那么我有什么可以改善的方面,还是我必须等到一支有经验的团队来改善它?还是永远无法在我的方案中使用,而我必须找出其他解决方案?

  

Here是firefox开发工具创建的性能评估的链接。

1 个答案:

答案 0 :(得分:0)

经过数小时的调查和调试,我得出的结论是,性能问题是由多个指令的组合引起的。

FormControl本身不对我遇到的延迟负责。相反,我发现对Renderer(2)的调用使事情变得非常缓慢。与其他一些或多或少繁重的计算配对导致此行为。我只是没想到像“ .addClass”之类的渲染时间会花费约400ms。