Требование проверки флажка
Я хочу, чтобы кнопка была отключена до тех пор, пока флажок не будет установлен с помощью FormBuilder для 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);
}
}
Ответы
Ответ 1
.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();
}
}
Работает Плункер.
Пожалуйста, дайте мне знать, если какие-либо изменения требуются.
Ответ 2
Вы можете просто использовать ValidatorPattern и проверить правильное (логическое) значение:
<input type="checkbox" [formControl]="myForm.controls['isTosRead']">
и вот ссылка:
this.myForm = builder.group({
isTosRead: [false, Validators.pattern('true')]
});
Ответ 3
Начиная с версии Angular 2.3.1 вы можете использовать Validators#requiredTrue
:
Составная часть:
this.formGroup = this.formBuilder.group({
cb: [false, Validators.requiredTrue]
});
Шаблон:
<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>
STACKBLITZ DEMO
Ответ 4
Я обнаружил, что Validator.required не работает должным образом для флажков.
Если вы установите флажок, а затем снимите флажок, FormControl все равно покажет его как действительный, даже если он не установлен. Я думаю, что он проверяет только то, что вы его установили, будь то true или false.
Вот простой простой валидатор, который вы можете добавить в свой FormControl:
mustBeChecked(control: FormControl): {[key: string]: string} {
if (!control.value) {
return {mustBeCheckedError: 'Must be checked'};
} else {
return null;
}
}
Ответ 5
<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() {
}
}
Ответ 6
Это было решено в Angular версии 2.3.0.
Просто используйте: Validators.requiredTrue instead of Validators.required
.
Ответ 7
У меня есть этот очень простой пример:
В вашем компоненте:
login : FormGroup;
constructor(@Inject(FormBuilder)formBuilder : FormBuilder) {
this.login = formBuilder.group({userName: [null], password: [null],
staySignedIn: [false,Validators.pattern('true')]});
}
В вашем HTML:
<form [formGroup]="login" (ngSubmit)="onSubmit()">
<div class="form-group">
<input formControlName="userName" required>
</div>
<div class="form-group">
<input formControlName="password" type="password" required>
</div>
<div>
<label>
<input formControlName="staySignedIn" checked="staySignedIn" type="checkbox"> bla
</label>
</div>
<button type="submit">bla</button>
<div >
<a href>bla?</a>
</div>
</form>
Ответ 8
Для Angular 8 я сделал это, как показано ниже, для проверки, установлен ли хотя бы один флажок среди трех флажков
form = new FormGroup({
// ...more form controls...
myCheckboxGroup: new FormGroup({
myCheckbox1: new FormControl(false),
myCheckbox2: new FormControl(false),
myCheckbox3: new FormControl(false),
}, requireCheckboxesToBeCheckedValidator()),
// ...more form controls...
});
создал собственный валидатор
import { FormGroup, ValidatorFn } from '@angular/forms';
export function requireCheckboxesToBeCheckedValidator(minRequired = 1): ValidatorFn {
return function validate (formGroup: FormGroup) {
let checked = 0;
Object.keys(formGroup.controls).forEach(key => {
const control = formGroup.controls[key];
if (control.value === true) {
checked ++;
}
});
if (checked < minRequired) {
return {
requireCheckboxesToBeChecked: true,
};
}
return null;
};
}
и использовал его, как показано ниже в HTML
<ng-container [formGroup]="form">
<!-- ...more form controls... -->
<div class="form-group" formGroupName="myCheckboxGroup">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" formControlName="myCheckbox1" id="myCheckbox1">
<label class="custom-control-label" for="myCheckbox1">Check</label>
</div>
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" formControlName="myCheckbox2" id="myCheckbox2">
<label class="custom-control-label" for="myCheckbox2">At least</label>
</div>
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" formControlName="myCheckbox3" id="myCheckbox3">
<label class="custom-control-label" for="myCheckbox3">One</label>
</div>
<div class="invalid-feedback" *ngIf="form.controls['myCheckboxGroup'].errors && form.controls['myCheckboxGroup'].errors.requireCheckboxesToBeChecked">At least one checkbox is required to check</div>
</div>
<!-- ...more form controls... -->
</ng-container>
Ответ 9
Создать метод для обнаружения любых изменений
checkValue(event: any) {
this.formulario.patchValue({
checkboxControlName: event.target.checked
})
}
Поместите этот метод в изменение события и свойства ngModel required
<input (change)="checkValue($event)" type="checkbox" formControlName="checkboxControlName" value="true" ngModel required>
И использовать конвективный способ для проверки
this.formulario = new FormGroup({
checkboxControlName: new FormControl('', [Validators.required])
});
Источник