这应该是相对容易的,不确定我为什么要挣扎。
我有三个复选框,我想确保用户单击了一个并且只有一个。因此,验证者应检查是否已选中其他两个框中的任何一个,并防止其他选择。应该确保至少检查了一个。
我尝试使用自定义验证器,但是您只能传递控件。我需要检查所有复选框以进行验证的东西。
<form class="example-section" [formGroup]="queryType">
<mat-checkbox class="example-margin" [(ngModel)]="artist" formControlName="artist">Artist</mat-checkbox>
<mat-checkbox class="example-margin" [(ngModel)]="album" formControlName="album">Album</mat-checkbox>
<mat-checkbox class="example-margin" [(ngModel)]="track" formControlName="track">Track</mat-checkbox>
</form>```
export class SearchComponent implements OnInit, OnChanges {
filteredSearchItems: Observable<SearchResult[]>;
isLoading = false;
searchForm: FormGroup;
queryType: FormGroup;
disabled: boolean = false;
artist: boolean;
album: boolean;
track: boolean;
constructor(private searchService: SearchService, private fb:
FormBuilder) {
this.searchForm = this.fb.group({
searchInput: new FormControl(null)
});
this.queryType = this.fb.group({
'artist': new FormControl(false,[CustomValidators.validateQuery]),
'album': new FormControl(false,[CustomValidators.validateQuery]),
'track': new FormControl(false,[CustomValidators.validateQuery])
});
}
export class CustomValidators {
static validateQuery(control: FormGroup): { [s: string]: boolean }
{//not sure how to pass in all boxes
for(const con of control.controls) { // somewhere here is the answer
if(con.value) {
return { alreadyChecked: true}
}
}
return null;
};
}
答案 0 :(得分:0)
有2种可能的解决方案。
1。)您可以使用单选按钮代替复选框,那样只能选择这三个选项之一。
2。)如果您确实要使用该复选框。您可以像这样实现它。还创建了一个 Stackblitz Demo 供您参考
<mat-checkbox class="example-margin"
formControlName="artist"
[disabled]="album || track">Artist</mat-checkbox> // This will be disabled when album or track is already checked
<mat-checkbox class="example-margin"
formControlName="album"
[disabled]="artist || track">Album</mat-checkbox> // This will be disabled when artist or track is already checked
<mat-checkbox class="example-margin"
formControlName="track"
[disabled]="artist || album">Track</mat-checkbox> // This will be disabled when artist or album is already checked.
这样,用户只能检查这三个选项中的一项。
注意: