J'utilise ReactiveFormsModule et j'ai défini tous mes contrôles de formulaire, y compris des validateurs simples tels que Validators.required
dans une configuration const.
Je voulais ajouter un validateur personnalisé à l'un de ces FormControls.
J'ai actuellement ajouté le validateur personnalisé en tant que fonction dans cette configuration, et cela fonctionne bien, mais il n'appartient pas ici, il a vraiment besoin de vivre dans mon composant, mais je ne sais pas comment je peux simplement attacher un validateur personnalisé manuellement après que FormBuilder
a configuré tous mes contrôles.
Voir le commentaire de code ci-dessous qui ressemble à ceci
Comment attacher ici
* ??? *
this.form.get ('site_id'). ajouter un valiateur personnalisé
Ceci est mon code de configuration actuel.
import {FormControl, Validators, FormBuilder} from '@angular/forms';
var fb = new FormBuilder();
function exampleValidator(control: FormControl): { [s: string]: boolean} {
if (control.value === 'Example'){
return { example: true };
}
return null;
}
export const formConfig = fb.group({
'extract_batch_id': ['bbbbbbbbbbbbb',
[
Validators.required
]],
'site_id': ['blah',
[
Validators.required,
exampleValidator
]]
});
J'ai une directive qui devrait vraiment stocker le validateur personnalisé
Composant de recherche d'emploi
import {Component, Input, OnInit, OnDestroy} from '@angular/core';
import {FormGroup, FormControl} from '@angular/forms';
import {ActivatedRoute} from '@angular/router';
import {Subscription} from 'rxjs';
import {Job} from '../../../models/job';
import {JobService} from '../../../services/api/job.service';
import {DebugService} from '../../../common/debug/debug.service';
import {formConfig} from './edit.form-config';
@Component({
selector: 'wk-job-search-edit',
template: require('./edit.html')
})
export class JobSearchEditComponent {
form: FormGroup;
job: Job;
@Input() jobId: number;
private subscription: Subscription;
constructor(
private route: ActivatedRoute,
private jobService: JobService,
private debug: DebugService){
// Configure form FormGroup via exported formConfig
this.form = formConfig;
// How do I Attach Here
// *** ??? ***
// this.form.get('site_id').add custom valiator
}
/*
exampleValidator(control: FormControl): { [s: string]: boolean} {
if (control.value === 'Example'){
return { example: true };
}
return null;
}
*/
}
JobSearch Edit.html
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<button type="submit" class="btn btn-success" [disabled]="!form.valid">Save</button>
<div class="form-group" [ngClass]="{'has-danger':!form.get('extract_batch_id').valid}">
<label for="extract_batch_id" class="form-control-label">Extract Batch</label>
<input id="extract_batch_id" formControlName="extract_batch_id" type="text" placeholder="Extract Batch" class="form-control input-sm">
<div *ngIf="!form.get('extract_batch_id').valid">
<div class="form-control-feedback">Extract Batch is required?</div>
<small class="form-text text-muted">Please enter a Extract Batch, eg. xyz.</small>
</div>
</div>
<div class="form-group" [ngClass]="{'has-danger':!form.get('site_id').valid}">
<label for="site_id" class="form-control-label">Site</label>
<input id="site_id" formControlName="site_id" type="text" placeholder="Site" class="form-control input-sm">
<div *ngIf="!form.get('site_id').valid">
<div class="form-control-feedback">Site is required?</div>
<small class="form-text text-muted">Please enter a Site, eg. xyz.</small>
</div>
</div>
</form>
En regardant votre code, ce que vous pourriez faire:
<div class="form-group" [ngClass]="{'has-danger':!form.get('site_id').valid}">
<label for="site_id" class="form-control-label">Site</label>
<input id="site_id" [formControl]="site_id_control" type="text" placeholder="Site" class="form-control input-sm">
<div *ngIf="!form.get('site_id').valid">
<div class="form-control-feedback">Site is required?</div>
<small class="form-text text-muted">Please enter a Site, eg. xyz.</small>
</div>
</div>
Regardez [formControl] = "site_id_control"
Ensuite, de cette façon, vous pouvez ajouter ou supprimer les validateurs de ce contrôle spécifique comme ceci:
à l'intérieur de votre classe:
export class JobSearchEditComponent {
private site_id_control=this.form.controls['site_id'];
updateValidator(){
let exisitingValidators = this.site_id_control.validators;
this.site_id_control.setValidators(Validators.compose([...existingValidators , exampleValidator]))
// you probably also need this :
this.site_id_control.updateValueAndValidity();
}
}