【问题标题】:Angular 2 validation together with the child componentAngular 2 验证连同子组件
【发布时间】:2019-02-08 16:51:23
【问题描述】:

在父组件内部,我有一个子组件。两者都有其必填字段。最后,仅当两个组件都有效时,我才需要启用提交按钮(在这种情况下,它们的所有必填字段都已填写)。

我怎样才能做到这一点,尤其是使用模板驱动的验证?

种子代码

父组件

@Component({
    selector: 'parent-comp',
    templateUrl: 'parent.html'
})
export class Parent {

}

<input pInputText name="txt1" id="txt1"
                       required/>

<child-comp></child-comp>

<button pButton type="button" label="Submit"
            [disabled]="IF ONE OF THE COMPS IS NOT VALID"></button>

子组件

@Component({
    selector: 'child-comp',
    templateUrl: 'child.html'
})
export class Child {

}

<input pInputText name="txt2" id="txt2"
                       required/>

【问题讨论】:

    标签: angular


    【解决方案1】:

    为了同时验证父子组件,需要将一个表单拆分成多个组件。

    父html

    <form #parentForm="ngForm">
                <input pInputText name="txt1" id="txt1"
                       required/>
    
          <child-comp></child-comp>
    
            <button pButton type="button" label="Submit"
            [disabled]="!parentForm.valid"></button>
            </form>
    

    父组件

     import { Component } from '@angular/core';
     @Component({
           selector: 'parent-comp',
            templateUrl: 'parent.html'
    })
    export class Parent {
    
    }
    

    子表单不能有表单标签

    <input pInputText name="txt2" id="txt2"
                       required/>
    

    子组件

    import { Component } from '@angular/core';
    import { ControlContainer, NgForm } from '@angular/forms';
    @Component({
    selector: 'child-comp',
    templateUrl: 'child.html',
    viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]
     })
     export class Child {
     }
    

    【讨论】:

    • 这对我有用。只需要导入 ControlContainer 和 NgForm,并添加 viewProviders。快速简单。
    【解决方案2】:

    您可以在 child 中创建 @Output 变量,该变量将发出 form.valid 值。您需要使用FormBuilderFormGroup(这里看不到)。

    每次更改表单内部的内容时,都需要调用一个会发出 onchange 的函数。

    孩子的例子:

    @Output onchange: EventEmitter<Boolean> = new EventEmitter(false);
    formInChild: FormGroup;
    
    constructor(private fb: FormBuilder) {
      this.formInChild = fb.group(...)
      this.formInChild.valueChanges.subscribe(() => {
        this.onchange.emit(this.form.valid);
      }
    }
    

    现在在父母中:

    (查看)

    <child-comp (onchange)="setButtonState($event)"></child-comp>
    <button pButton type="button" label="Submit"
                [disabled]="!allvalid"></button>
    

    (组件)

    formInParent: FormGroup;
    allvalid: boolean = false;
    
    constructor(private fb: FormBuilder) {
      this.formInParent = fb.group(...);
    }
    
    setButtonState(formFromChildValid) {
      this.allvalid = this.formInParent.valid && formFromChildValid;
    }
    

    在这种情况下,每次您更改子表单中的某些内容时,都会将子表单的有效状态发送给父级,父级将更新按钮监听的 allvalid 变量。

    【讨论】:

      猜你喜欢
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2018-06-07
      • 2017-11-08
      • 2023-03-27
      • 2016-08-19
      • 2017-12-31
      相关资源
      最近更新 更多