要求选中复选框

nat*_*asm 43 angular2-forms angular angular-reactive-forms

我想要一个按钮被禁用,直到使用FormBuilder for Angular检查复选框.我不想明确检查复选框的值,而是希望使用验证器,以便我可以简单地检查form.valid.

在下面的两个验证案例中,复选框都是

interface ValidationResult {
  [key:string]:boolean;
}

export class CheckboxValidator {
  static checked(control:Control) {
    return { "checked": control.value };
  }
}

@Component({
  selector: 'my-form',
  directives: [FORM_DIRECTIVES],
  template: `  <form [ngFormModel]="form" (ngSubmit)="onSubmit(form.value)">
    <input type="checkbox" id="cb" ngControl="cb">
    <button type="submit" [disabled]="!form.valid">
    </form>`
})

export class SomeForm {
  regForm: ControlGroup;

  constructor(fb: FormBuilder) {
    this.form = fb.group({
      cb: [ CheckboxValidator.checked ]
      //cb: [ false, Validators.required ] <-- I have also tried this
    });
  }

  onSubmit(value: any) {
    console.log('Submitted: ', this.form);
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 67

您可以使用ValidatorPattern并检查右(布尔)值:

<input type="checkbox" [formControl]="myForm.controls['isTosRead']">
Run Code Online (Sandbox Code Playgroud)

这是绑定:

this.myForm = builder.group({
        isTosRead: [false, Validators.pattern('true')]
    });
Run Code Online (Sandbox Code Playgroud)

  • 这是imho的最佳答案.也可以使用`formControlName ="isTosRead"`而不是`[formControl] ="..."`. (4认同)

dev*_*033 56

Angular 2.3.1开始,您可以使用Validators#requiredTrue:

零件:

this.formGroup = this.formBuilder.group({
  cb: [false, Validators.requiredTrue]
});
Run Code Online (Sandbox Code Playgroud)

模板:

<form [formGroup]="formGroup">
  <label><input type="checkbox" formControlName="cb"> Accept it</label>
  <div style="color: red; padding-top: 0.2rem" *ngIf="formGroup.hasError('required', 'cb')">
    Required
  </div>
  <hr>
  <div>
    <button type="submit" [disabled]="formGroup.invalid">Submit</button>
  </div>
</form>
Run Code Online (Sandbox Code Playgroud)

STACKBLITZ DEMO

  • Validators.requiredTrue是关键! (10认同)
  • @ryanrain 请详细说明为什么它不适合您。 (2认同)

Max*_*xim 10

我发现Validator.required对复选框无法正常工作.如果选中一个复选框然后取消选中它,即使取消选中,FormControl仍会将其显示为有效.我认为它只会检查你是否将它设置为某种东西,无论是真还是假.

这是一个可以添加到FormControl的快速简单验证器:

  mustBeChecked(control: FormControl): {[key: string]: string} {
    if (!control.value) {
      return {mustBeCheckedError: 'Must be checked'};
    } else {
      return null;
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用“ Validators.requiredTrue”代替“ Validators.required”。 (4认同)

小智 8

<h1>LOGIN</h1>
<form [formGroup]="signUpForm"> 
    <input type="checkbox" formControlName="cb">
    <button type="submit" [disabled]="!loginForm.valid" (click)="doLogin()">Log in</button>
</form>

export class Login { 
  public signUpForm: FormGroup;

  constructor(fb: FormBuilder) {
    this.signUpForm = fb.group({
      cb: [false, Validators.requiredTrue]
    });
  }
  doLogin() {

  }
}
Run Code Online (Sandbox Code Playgroud)


mic*_*yks 5

.ts

@Component({
  selector: 'my-app', 
  template: `
    <h1>LOGIN</h1>
    <form [ngFormModel]="loginForm"  #fm="ngForm"  (submit)="doLogin($event)"> 

          <input type="checkbox" id="cb" ngControl="cb" #cb="ngForm" required>
          <button type="submit" [disabled]="!loginForm.valid">Log in</button>

          <br/>
              <div>Valid ={{cb.valid}}</div>
              <div>Pristine ={{cb.pristine}}</div>
              <div>Touch ={{cb.touched}}</div>
              <div>form.valid?={{loginForm.valid}}</div>
          <BR/>
          <BR/>

    </form>
    `,
  directives: [ROUTER_DIRECTIVES,FORM_DIRECTIVES,CORE_DIRECTIVES]
})

export class Login { 
  constructor(fb: FormBuilder) {
    this.loginForm = fb.group({
      cb: [false, Validators.required],
    //cb: ['',Validators.required] - this will also work.

    });
  }
  doLogin(event) {
    console.log(this.loginForm);
    event.preventDefault();
  }
}

Run Code Online (Sandbox Code Playgroud)

工作Plunker

如果需要任何更改,请告诉我。

  • 您需要使用 `Validators.requiredTrue` 才能正常工作。否则,如果您选中并取消选中它仍然是“有效的”。 (14认同)
  • 因此,在 angular github repo 中进行一些挖掘之后,正确的解决方法是不将复选框值设置为 false,而是设置为 '' 。所以对于 beta.6,正确的方法是 `cb: ['', Validators.required]`。如果您编辑答案,我会将其标记为正确。 (2认同)