【问题标题】:Property 'nome' does not exist on type 'FormGroup'“FormGroup”类型上不存在属性“nome”
【发布时间】:2019-10-03 19:28:28
【问题描述】:

我有一个 Angular 应用程序,我在通过 ReactiveForms 进行表单验证时遇到了一些问题,我遇到了以下错误:

ng 服务错误:

src/app/pages/contact/contact.component.ts(48,32):错误 TS2339: 类型“FormGroup”上不存在属性“assunto”。 src/app/pages/contact/contact.component.ts(50,57):错误 TS2339: 类型“FormGroup”上不存在属性“assunto”。 src/app/pages/contact/contact.component.ts(51,30):错误 TS2339: 类型“FormGroup”上不存在属性“nome”。 src/app/pages/contact/contact.component.ts(52,33):错误 TS2339: 类型“FormGroup”上不存在属性“empresa”。 src/app/pages/contact/contact.component.ts(53,32):错误 TS2339: 类型“FormGroup”上不存在属性“电子邮件”。 src/app/pages/contact/contact.component.ts(54,34):错误 TS2339: 类型“FormGroup”上不存在属性“telefone”。

contact.component.html

<form class="col-s4 dados-form" [formGroup]="dadosForm">

<mat-form-field style="width:100%" class="full-width">
  <input matInput placeholder="Nome" formControlName="nome" required>
  <mat-error *ngIf="dadosForm.get('nome').dirty || dadosForm.get('nome').touched">
    O campo nome deve ser preenchido</mat-error>
</mat-form-field> <br>

<mat-form-field style="width:100%" class="full-width">
  <input matInput placeholder="Empresa" formControlName="empresa" required>
  <mat-error
    *ngIf="dadosForm.get('empresa').dirty || dadosForm.get('empresa').touched">
    O campo empresa deve ser preenchido</mat-error>
</mat-form-field> <br>

<mat-form-field style="width:100%" class="full-width">
  <input matInput placeholder="E-Mail" formControlName="email" required>
  <mat-error
    *ngIf="dadosForm.get('email').dirty || dadosForm.get('email').touched">
    {{getMailErrorMessage()}}</mat-error>
</mat-form-field> <br>
<mat-form-field style="width:100%" class="full-width">
  <input matInput maxlength="15" id="phoneInput" formControlName="telefone" [mask]="phoneMask" placeholder="Telefone para Contato" required />
  <mat-error
    *ngIf="dadosForm.get('telefone').dirty || dadosForm.get('telefone').touched">
    O campo telefone deve ser preenchido</mat-error>
</mat-form-field> <br>

<mat-form-field style="width:100%" class="full-width">
  <mat-label>Produto Desejado</mat-label>
  <mat-select matInput formControlName="assunto" required>
    <mat-optgroup *ngFor="let categoria of produtos" [label]="categoria.key">
      <mat-option *ngFor="let produto of categoria.value" [value]="produto">
        {{produto}}
      </mat-option>
    </mat-optgroup>
  </mat-select>
  <mat-error
    *ngIf="dadosForm.get('assunto').dirty || dadosForm.get('assunto').touched">
    O campo assunto deve ser preenchido</mat-error>
</mat-form-field><br>

<mat-form-field style="width:100%" class="full-width">
  <textarea matInput placeholder="Mensagem" formControlName="mensagem" required></textarea>
  <mat-error
    *ngIf="dadosForm.get('mensagem').dirty || dadosForm.get('mensagem').touched">
    O campo mensagem deve ser preenchido</mat-error>
</mat-form-field><br>

<div class="form-buttons">
  <button mat-button mat-raised-button id="submitButton" [disabled]="!dadosForm.valid" matTooltip="" color="primary" (click)="sendMail(mensagem)">Enviar</button>
</div>

</form>

contact.component.ts

  dadosForm = new FormGroup({
    nome: new FormControl('', [Validators.required]),
    empresa: new FormControl('', [Validators.required]),
    email: new FormControl('', [Validators.required, Validators.email]),
    telefone: new FormControl('', [Validators.required]),
    assunto: new FormControl('', [Validators.required]),
    mensagem: new FormControl('', [Validators.required])
  });

【问题讨论】:

  • 制作一个堆栈闪电战示例
  • 我在你的代码中没有发现任何明显的问题,请为它做一个堆栈闪电战
  • 看起来您的模板在表单构造之前呈现。您可能需要将*ngIf=dadosForm 添加到&lt;form&gt; 元素。
  • @ala 我尝试创建一个 Stackblitz,但 stackblitz 并没有显示所有错误。并且没有与表单相关的错误。
  • @TheHeadRush,我试过做 *ngIf,但没有运气。

标签: angular typescript angular6 angular7 angular4-forms


【解决方案1】:

我刚刚收到该错误,例如,在您的第一个输入中,我就这样做了:

<mat-error *ngIf="dadosForm.get('nome').dirty || dadosForm.get('nome').touched">O campo nome deve ser preenchido</mat-error>

只需更改*ngIf 内的验证:

<mat-error *ngIf="dadosForm.get('nome').invalid && (dadosForm.get('nome').dirty || dadosForm.get('nome').touched)">O campo nome deve ser preenchido</mat-error>

我使用的 Angular 10+ 与您使用相同的输入模板,我没有使用 dirtytouched,因此,对于唯一验证,您可以在 *ngIf 中使用 dadosForm.invalid 并获取您正在验证的唯一消息错误。

等效:

<mat-error *ngIf="dadosForm.get('nome').invalid">O campo nome deve ser preenchido</mat-error>

另一个等价物:

<mat-error *ngIf="dadosForm.invalid">O campo nome deve ser preenchido</mat-error>

【讨论】:

  • 我想知道是否有其他方法可以做到这一点。
【解决方案2】:
<div *ngIf="f.name.invalid && f.name.touched">
                                <small class="text-danger" *ngIf="f.name.errors?.required">Please enter the name!</small>
                            </div>

在ts文件中

get f() { return this.form.controls; }

【讨论】:

    【解决方案3】:

    使用表单生成器FormBuilder 进行验证

    先导入这些依赖

    import { FormGroup, FormBuilder, Validators } from '@angular/forms';
    

    为表单组创建变量

    formGroupName: FormGroup;
    
    constructor(private _formBuilder: FormBuilder) { }
    

    ngOnInit方法中设置验证码

    this.formGroupName = this._formBuilder.group({
        nome: ['', Validators.required],
        empresa: ['', Validators.required],
        email: ['', [Validators.required, Validators.email]],
        telefone: ['', Validators.required],
        assunto: ['', Validators.required],
        mensagem: ['', Validators.required]
    });
    

    试试这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 2021-01-09
      • 2021-07-10
      • 2017-07-22
      • 2023-03-26
      相关资源
      最近更新 更多