问题
I made a model-driven form in angular 2, and one of the input fields must show up only if a checkbox above is unchecked.I did this with *ngIf. My question is how can I set that input required only if the checkbox is unchecked? In angular 1.x i could make this happen with the ng-required="condition" in the view.
Here is the html:
//the checkbox
<div class="checkbox col-sm-9">
<label>
<input type="checkbox" id="getCompanyAddress" style="cursor: pointer;" [formControl]="form.controls['address']" >Use the company address
</label>
</div>
// the option input:
<div *ngIf="form.value.address == false" class="form-group" [ngClass] = "{'has-error':!form.controls['address'].valid && form.controls['address'].touched}" >
<label for="add_gestion_adress" class="col-sm-3 control-label">Address
</label>
<div class="col-sm-9"><textarea rows="1" id="add_gestion_adress" class="form-control" name="add_gestion_adress" [formControl]="form.controls['address']" ></textarea>
</div>
</div>
//and the model code:
form: FormGroup;
constructor(fb:FormBuilder){
this.form = fb.group({
'name': [null,Validators.compose([Validators.required, Validators.minLength(1)])],
'type': ["en gros",Validators.compose([Validators.required, Validators.minLength(2)])],
'person':[null,Validators.compose([Validators.required, Validators.minLength(1)])],
'address':[false,Validators.compose([Validators.minLength(1)])],
'locality':[null, Validators.compose([Validators.required])],
'county':[null,Validators.compose([Validators.required])],
'country':[null,Validators.compose([Validators.required])]
})
}
回答1:
One way to do it is to listen for value changes in the checkbox form control and add/remove validators in the other control accordingly.
Example:
this.form.get('checkbox-control').valueChanges.map(
value => {
if(value) {
this.form.get('other-control').setValidators(Validators.required);
}else {
this.form.get('other-control').clearValidators();
}
}
);
回答2:
<textarea [required]="your angular expression">
The above works in the latest version of Angular 4
回答3:
The FormBuilder takes a second argument which accepts a validator which is intended for cross-field validation:
this.form = fb.group({
'name': [null,Validators.compose([Validators.required, Validators.minLength(1)])],
'type': ["en gros",Validators.compose([Validators.required, Validators.minLength(2)])],
'person':[null,Validators.compose([Validators.required, Validators.minLength(1)])],
'address':[false,Validators.compose([Validators.minLength(1)])],
'locality':[null, Validators.compose([Validators.required])],
'county':[null,Validators.compose([Validators.required])],
'country':[null,Validators.compose([Validators.required])]
}
, { validator: this.crossFieldValidation });
You can define it to do whatever.
crossFieldValidation(ctrl: FormGroup): ValidationErrors|null {
let isRequired = ctrl.controls.myCheckbox.value === true;
let hasValue = ctrl.controls.myMaybeRequiredControlXX.value;
if (isRequired && !hasValue) return {XXrequired: true};
return null;
}
To check for the error for display/ngClass, use form.errors?.XXrequired
or whatever key your crossFieldValidation()
returned, instead of form.controls.XX.errors?.required
.
来源:https://stackoverflow.com/questions/39955807/angular-2-ng-required