Dies ist vollständig mit einer ngModelGroup
und einer benutzerdefinierten Richtlinie für die Validierung möglich. Schlüssel zum Verständnis, warum dies funktioniert ist, dass ngModelGroup
Erstellt und bindet eine FormGroup Instanz an ein DOM-Element.
Zunächst werden wir unsere Richtlinie bauen aus, die mit nichts ziemlich vorformulierten ist Besonderes los:
@Directive({
selector: '[hasRequiredCheckboxInGroup]',
providers: [{provide: NG_VALIDATORS, useExisting: HasRequiredCheckBoxInGroup, multi: true}]
})
export class HasRequiredCheckBoxInGroup implements Validator, OnChanges {
private valFn = Validators.nullValidator;
constructor() {
this.valFn = validateRequiredCheckboxInGroup();
}
validate(control: AbstractControl): {[key: string]: any} {
return this.valFn(control);
}
}
Unsere Validierungsfunktion ist, wo wir unsere Schlüssel Wissen nehmen, dass ngModelGroup
eine FormGroup
schafft und es gelten : in unserem Modul
function validateRequiredCheckboxInGroup() : ValidatorFn {
return (group) => { //take the group we declare in the template as a parameter
let isValid = false; //default to invalid for this case
if(group) {
for(let ctrl in group.controls) {
if(group.controls[ctrl].value && typeof group.controls[ctrl].value === 'boolean') { // including a radio button set might blow this up, but hey, let's be careful with the directives
isValid = group.controls[ctrl].value;
}
}
}
if(isValid) {
return null;
} else {
return { checkboxRequired: true };
}
}
}
und schließlich die Richtlinie aufgenommen und erklärt haben, wir auf die Vorlage zurückkehren (muss in einer Form sein):
<form #f="ngForm">
<div ngModelGroup="checkboxes" #chks="ngModelGroup" hasRequiredCheckboxInGroup>
<input type="checkbox" name="chk1" [(ngModel)]="checks['1']"/>
<input type="checkbox" name="chk2" [(ngModel)]="checks['2']"/>
</div>
<div>
{{chks.valid}}
</div>
</form>
Und hier ist ein Plunker mit diesem alle verfügbar zu spielen: http://plnkr.co/edit/AXWGn5XwRo60fkqGBU3V?p=preview
Wie können wir einen Parameter an die Validierungsfunktion übergeben? Zum Beispiel, wenn ich wollte, dass ein benutzerdefinierter Validator Min/Max bei einer numerischen Eingabe erzwingt? – Learning2Code
Genau das, was ich gesucht habe! Großartiges Beispiel, danke –