【问题标题】:Angular 7 - How to show error messages in child components of form when submitting the formAngular 7 - 提交表单时如何在表单的子组件中显示错误消息
【发布时间】:2019-01-29 08:31:48
【问题描述】:

我正在使用 Angular 7Angular Material 实现一个注册页面。在这个页面中,我使用了一个密码输入组件,它获取对所用 FormGroup 的引用。外部组件处理逻辑部分(例如 FormGroup 的外观、FormControl 的定义方式以及每个输入的验证方式)。当我单击密码输入并单击其他位置/输入任何无效内容时,输入的错误消息将正确显示。但是当我点击提交按钮没有触摸任何输入字段时,FormGroup的FormControl被验证(FormControl甚至说它有错误)但没有被触摸,所以没有 显示错误消息。

我已经查找了如何解决这种行为。一些人建议在点击提交按钮后手动设置所有表单控件。是的,这行得通,但我想要一个通用的解决方案,这样我以后就不必为每一个表单都这样做了。

signup.component.ts:

export class SignupComponent implements OnInit {

    signupForm: FormGroup;

    constructor() { }

    ngOnInit() {
        this.signupForm = new FormGroup({
            'password': new FormControl('', [Validators.required]),
            'contact': new FormControl('', [Validators.required])
        });
    }

    onSubmit() {
        console.log('Form validity: ' + this.signupForm.valid);
    }

}

signup.component.html:

<mat-card class="signup-card">
    <h1 class="signup-title">Sign up</h1>

    <form [formGroup]="signupForm" #form="ngForm" (ngSubmit)="onSubmit()" fxLayout="column">
        <!-- Password -->
        <app-base-password-input [parentForm]="signupForm"></app-base-password-input>

        <!-- Contact -->
        <div class="signup-contact">
            <mat-checkbox formControlName="contact" required>We may contact you.</mat-checkbox>
            <mat-error *ngIf="form.submitted && signupForm.controls['contact'].hasError('required')">Please check this box.</mat-error>
        </div>

    <button class="signup-button" mat-raised-button color="primary" type="submit">Sign up</button>

    </form>
</mat-card>

app-base-password-input.component.ts:

export class BasePasswordInputComponent {

    @Input() parentForm: FormGroup;

    constructor() { }

}

app-base-password-input.component.html:

<mat-form-field [formGroup]="parentForm">
    <mat-label>Password</mat-label>
    <input matInput type="password" formControlName="password" required>
    <mat-error *ngIf="parentForm.controls['password'].hasError('required')">Password is required.</mat-error>
</mat-form-field>

我的期望:
当我单击提交按钮而不触摸/单击任何输入字段时,每个输入都会显示一条错误消息(例如,嘿,用户!我是必需的!)。

实际发生的情况:
当我单击提交按钮而不触摸/单击任何输入字段时,只有外部组件中定义的 FormControls 显示错误消息(本例:联系复选框)。我的输入组件没有显示错误消息(本例:密码组件)。

我希望我发布了您回答我的问题所需的所有内容。如果还有不清楚的地方,我会更新帖子:)

【问题讨论】:

    标签: angular forms submit formgroups


    【解决方案1】:

    正如您所说,我知道的唯一方法是在 onSubmit() 方法中手动将每个 FormControl 设置为“已触摸”。

    SignupComponent.ts

    onSubmit(){
        console.log('Form validity: ' + this.signupForm.valid);
        touchAllElements(this.signupForm);
    }
    
    touchAllElements(formGroup:FormGroup){
        Object.keys(formGroup["controls"]).forEach(element => {
            formGroup.get(element).markAsTouched();
        });
    }
    

    为避免在每个带有表单的组件中重复此方法,您可以将 touchAllElements 移动到服务中

    【讨论】:

    • 我希望有一种方法可以自动执行此操作。但仍然感谢您的回答:)
    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2021-09-15
    • 2019-07-16
    • 2022-11-18
    相关资源
    最近更新 更多