這完全可能與ngModelGroup
和用於驗證的自定義指令。理解這種工作原理的關鍵是:ngModelGroup
創建FormGroup實例並將其綁定到DOM元素。
首先,我們要建立我們的指令,它與什麼特別漂亮的樣板事情:
@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);
}
}
我們的驗證功能,我們把我們的關鍵知識ngModelGroup
創建FormGroup
並應用:
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 };
}
}
}
最後,已經包含在我們的模塊的指令聲明,我們返回到模板(需要在一種形式):
<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>
而這裏的這一切可用plunker一起玩: http://plnkr.co/edit/AXWGn5XwRo60fkqGBU3V?p=preview
我們如何將參數傳遞給validate函數?例如,如果我想要一個自定義驗證器來強制數字輸入的最小/最大值? – Learning2Code
正是我在找的!很好的例子謝謝 –