Lem*_*nur 5 html forms controls typescript angular
我一直在尝试对用户动态添加的div使用FormArray,但是找不到用户输入的控件!我总是有错误:
错误:找不到路径为“ textoAvisos-> 0-> assTipo”的控件
错误:无法找到路径为“ textoAvisos-> 0-> msgTipo”的控件
错误:找不到路径为“ textoAvisos-> 0-> dataTipo”的控件
div包含3个用户需要插入的输入,看来控件找不到它们。用户单击按钮后会添加新的div,因此为什么它需要动态,但这不是问题。我现在不必担心推入式插入,因为我需要首先验证用户的输入!
这是HTML:
<form style="text-align: center;" [formGroup]="janelaAtualizacaoForm" (ngSubmit)="cadastrarJanelaAtualizacao()">
<div *ngFor="let disparaEmail of disparaEmails; let i=index" formArrayName="textoAvisos" class="ui-g-4" style="margin-right: 10px; border: 1px solid #c8c8c8; border-radius: 5px; min-width: 466.828px;">
<div [formGroupName]="i">
<p class="titulo-campo font1 fw700">Assunto:</p>
<textarea pInputTextarea [rows]="2" formControlName="assTipo" required style="width: 100%; resize:unset; font-size: 18px;"></textarea>
<p class="titulo-campo font1 fw700">Tipo de Aviso:</p>
<p-editor [style]="{'height':'300px'}" formControlName="msgTipo" required></p-editor>
<p class="titulo-campo font1 fw700">Data:</p>
<p-calendar [readonlyInput]="true" formControlName="dataTipo" dateFormat="dd/mm/yy" showButtonBar="true" [locale]="localeService.getLocale()"[monthNavigator]="true" [yearNavigator]="true" yearRange="2018:2050" required></p-calendar>
</div>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
这是TS:
constructor(
private janelaAtualizacaoService: JanelaAtualizacaoService,
private segmentoInfoService: SegmentoInformacaoService,
private empresaService: EmpresaService,
private route: ActivatedRoute,
private router: Router, private fb: FormBuilder, private location: Location,
private changeDetector: ChangeDetectorRef, private localeService: LocaleService
) {
this.criarJanelas();
}
criarJanelas() {
this.janelaAtualizacaoSelecionado = [];
this.janelaAtualizacaoForm = new FormGroup({
textoAvisos: new FormArray([
new FormControl(
new FormGroup({
assTipo: new FormControl('', [Validators.required]),
msgTipo: new FormControl('', [Validators.required]),
dataTipo: new FormControl('', [Validators.required])
})
)
])
});
}
Run Code Online (Sandbox Code Playgroud)
谢谢大家的帮助!
您使用[formGroupName]不正确。在的行中<div [formGroupName]="i">,您尝试通过索引i获取formGroupName,该索引将不起作用,因为尚未创建任何以数字为名称的FormGroup。
我相信有关反应形式的Angular教程将为您提供帮助,特别是有关FormArrays和动态控件的部分:https ://angular.io/guide/reactive-forms#dynamic-controls-using-form-arrays
要解决您的问题,您可能需要进行以下更改。
HTML:
更改<div [formGroupName]="i">为<div [formGroup]="textoAvisos.controls[i]">
要么
更改*ngFor="let disparaEmail of disparaEmails; let i=index"为*ngFor="let formGroup of textoAvisos.controls; let i=index"
下面提供了第一个示例更改。
<form style="text-align: center;" [formGroup]="janelaAtualizacaoForm" (ngSubmit)="cadastrarJanelaAtualizacao()">
<div *ngFor="let disparaEmail of disparaEmails; let i=index" formArrayName="textoAvisos" class="ui-g-4" style="margin-right: 10px; border: 1px solid #c8c8c8; border-radius: 5px; min-width: 466.828px;">
<div [formGroup]="textoAvisos.controls[i]">
<p class="titulo-campo font1 fw700">Assunto:</p>
<textarea pInputTextarea [rows]="2" formControlName="assTipo" required style="width: 100%; resize:unset; font-size: 18px;"></textarea>
<p class="titulo-campo font1 fw700">Tipo de Aviso:</p>
<p-editor [style]="{'height':'300px'}" formControlName="msgTipo" required></p-editor>
<p class="titulo-campo font1 fw700">Data:</p>
<p-calendar [readonlyInput]="true" formControlName="dataTipo" dateFormat="dd/mm/yy" showButtonBar="true" [locale]="localeService.getLocale()"[monthNavigator]="true" [yearNavigator]="true" yearRange="2018:2050" required></p-calendar>
</div>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
打字稿:
FormControl从您的房屋中取出周围环境FormGroup,textoAvisos并为添加吸气剂textoAvisos。没有这个getter,您将得到关于textoAvisos未定义的错误。什么绊倒我们上的是,我们正在使用textoAvisos的formArrayName="textoAvisos,但你可以使用textoAvisos这样的,因为formArrayName明确地查找在一个formArray janelaAtualizacaoForm。当我们尝试这样做textoAvisos.controls时,*ngFor会收到错误消息,因为我们实际上在组件类中没有一个属性也要使用该名称进行绑定,因为它textoAvisos仅作为janelaAtualizacaoForm表单上的元素存在。
constructor(
private janelaAtualizacaoService: JanelaAtualizacaoService,
private segmentoInfoService: SegmentoInformacaoService,
private empresaService: EmpresaService,
private route: ActivatedRoute,
private router: Router, private fb: FormBuilder, private location: Location,
private changeDetector: ChangeDetectorRef, private localeService: LocaleService
) {
this.criarJanelas();
}
public get textoAvisos() {
return this.janelaAtualizacaoForm .get('textoAvisos') as FormArray;
}
criarJanelas() {
this.janelaAtualizacaoSelecionado = [];
this.janelaAtualizacaoForm = new FormGroup({
textoAvisos: new FormArray([
new FormGroup({
assTipo: new FormControl('', [Validators.required]),
msgTipo: new FormControl('', [Validators.required]),
dataTipo: new FormControl('', [Validators.required])
})
])
});
}
Run Code Online (Sandbox Code Playgroud)
我没有在现场环境中测试过这些,但希望它们能解决您的问题。