我有一张表格
n
输入:
<form class="new-user" [formGroup]="customFields">
<div *ngFor="let customField of customer['customFields']; let i = index">
<div *ngIf="isEditing(i)" [@phaseAndSlideLeftAnimation] class="cusomer-property">
<mat-form-field>
<mat-label i18n="getFormKey(customField)">{{getFormKey(customField)}}</mat-label>
<input
...
(keyup.enter)="finalizeEdit(customField, getFormKey(customField))"
(keyup.esc)="cancelEdit(customField)">
<mat-hint align="end">{{input.value?.length || 0}}/{{maxChars}}</mat-hint>
</mat-form-field>
</div>
<div *ngIf="isNotEditing(i)" [@phaseAndSlideLeftAnimation] class="cusomer-property pointer" (click)="viewEdit(customField)">
<div>{{getFormKey(customField)}}</div>
<div>{{getFormValue(customField)}}</div>
</div>
</div>
</form>
下面是我的动态表单初始化:
if(this.customer && this.customer['customFields'].length){
this.customer['customFields'].forEach((o, i) => {
if(o['value']){
this.customFields.addControl(o['name'], new FormControl(o['value'], Validators.required));
} else {
this.customer['customFields'][i]['value'] = '';
this.customFields.addControl(o['name'], new FormControl(o['value'], Validators.required));
}
});
}
我遇到的问题是,我单击的第一个字段(然后通过
*ngIf
)还没有水合物。
Ergo在我的伪提交函数中:
finalizeEdit(customField, key){
console.log(this.customFields['value'][key]);
customField['value'] = this.customFields['value'][key];
this.popCustomFields.next(this.customer);
this.closeEdit(customField);
}
this.customFields['value'][key]
(阅读:
this.customFields.value.myinput
)退货
undefined
.
…
但是,如果我单击并打开第二个“自定义字段”或输入,那么现在我的所有输入值都在表单中正确地实例化,并达到最快速度。
出于某种原因,这适用于表单的所有字段。
你会认为这是其中之一
*NGIF
-相关问题,但显然不是:
如果我揭示一个领域,那么就揭示另一个领域。他们现在都准备好了,之后的每一个领域都准备好了。
因此,该错误仅在加载视图后的第一个“input ngif-explay”上发生。
然后我发现了这个:
https://codecraft.tv/courses/angular/forms/submitting-and-resetting/
发现你可以这样做:
<form (ngSubmit)="onSubmit()">
.
.
.
</form>
希望这个功能在点火时能正确地得到水合物值,即使是在第一次提交时…
因为在我的情况下,我不在乎整个表单上的提交被解雇,所以这对我来说是可行的。
这是我的困惑:
如果我想通过
customField
作为一个论点
finalizeEdit()
,我需要把
<form>
标记在dom中,在
*ngFor
为了能够传递变量,提交需要。
问题是这会导致
n
一种输入形式,而不是一种形式
n
输入并破坏表单背后的整个代码。
我觉得这会使我的代码更糟。
另外,我还必须将每个表单提取到一个组件中,以正确初始化表单。
所有这些都没有保证这将解决我的“第一次点击”的错误。
理想情况下,我可以把
(ngSubmit)="onSubmit()"
在
<input>
而不是打开
<表格>
但我试过了,这不是一个可行的方法。
无论如何,我怀疑表格的提交并不能解决我的问题。为什么不在第一次尝试时实例化输入字段?
编辑(2018年7月16日):
在试验之后,我可以确认onsubmit不是一个解决方案,因为它只点火一次,如果在初始点火之前打开一行中的两个或多个字段,则根本无法点火。