【发布时间】: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