Angular: 找不到路径为 'variable-> 0 -> id' 的控件

Angular: Cannot find control with path: 'variable-> 0 -> id'

我一直在尝试将 FormArray 用于用户动态添加的 div,但我找不到用户输入的控件!我总是有错误:

Error: Cannot find control with path: 'textoAvisos -> 0 -> assTipo'

Error: Cannot find control with path: 'textoAvisos -> 0 -> msgTipo'

Error: Cannot find control with path: '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>

这是 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])
                })
            )
        ])
    });
}

感谢大家的帮助!

您使用 [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>

打字稿:

textoAvisos 中的 FormGroup 中删除周围的 FormControl,并为 textoAvisos 添加一个 getter。如果没有此 getter,您将收到关于 textoAvisos 未定义的错误。让我们感到困惑的是,我们在 formArrayName="textoAvisos 中使用了 textoAvisos,但您可以像那样使用 textoAvisos,因为 formArrayName 明确地在 [=27] 中查找 formArray =].当我们尝试在 *ngFor 中执行 textoAvisos.controls 时,我们会收到一个错误,因为我们的组件 class 中实际上没有 属性 来绑定该名称,因为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])
            })
        ])
    });
}

我没有在实际环境中测试过这些,但希望它们能解决您的问题。