【问题标题】:Angular 7 FormArray rendering performanceAngular 7 FormArray 渲染性能
【发布时间】:2018-11-27 17:14:47
【问题描述】:

我目前正在开发一个角度组件来呈现和修改发票。要编辑 lineitems,我使用 FormGroup 和 FormArray of line item Forms:

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

当通过 @Input 将 lineitem 设置到组件时,将为每个 lineitem 创建一个 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>

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

当有

我很确定问题出在各个 formControls 的渲染上。当我删除它们并只显示纯文本时,它会渲染得更快。

那么我有什么方法可以改进,还是我必须等到 Angular 团队改进它?或者它永远无法用于我的场景,我必须找出其他解决方案?

Here 是 Firefox 开发工具创建的性能测量链接。

【问题讨论】:

  • 您能否提供最少代码的stackblitz url。希望查看自定义指令和验证器代码
  • @AjayOjha 我很乐意为您提供一个 stackblitz 示例,但我无法与您分享这个高度专有的代码。根据我最初的问题,您还有其他问题或建议吗?
  • 然后从 html 中删除自定义指令,然后将 INPUT 元素与 formControlName 绑定并查看性能,我假设可能是您的自定义指令代码或验证器代码有问题。尝试全部删除,然后一一添加。这将帮助您找到问题的实际原因。如果您需要我的帮助,请告诉我。
  • @AjayOjha 我在发布这个问题之前提前做了这个。我确信问题来自 fromControlName 指令。
  • 酷,然后将问题记录在 angular repo 中。但我仍然不同意这个问题来自 formControlName 指令。无论如何。 :)

标签: angular typescript angular-reactive-forms angular7


【解决方案1】:

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

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

【讨论】:

  • 问题是否解决?如果没有,那么我想看看您调用 addClass 的自定义指令的代码之一。
  • 有点解决了,因为我现在知道在哪里调查:)。感谢您的帮助,但我无法共享代码
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多