Angular 6マテリアルを使用してアプリケーションを開発しています。オートコンプリート機能を持つ選択ボックスがあります。選択ボックスの検証が必要なので、ユーザーがオプションを検索して/彼女はオプションを選択せず、検索ボックスを選択ボックス内に保持し、選択ボックスの検証が必要なだけなので、フォームはAPIに投稿されます。私が達成したいのは、ユーザーがフォームを投稿できないようにすること検索用語を指定するだけでなく、オプションの1つを選択します。
<mat-form-field>
<input matInput placeholder="Pick one" aria-label="pick one" [matAutocomplete]="auto" [formControl]="form.controls['SELECTBOX_VALUE']">
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of myOptions | async" [value]="option.name"> <span>{{ option.name }}</span> </mat-option>
</mat-autocomplete>
</mat-form-field>
<small *ngIf="!form.controls['SELECTBOX_VALUE'].valid && form.controls['SELECTBOX_DEGER'].touched" class="mat-text-warn">Please select.</small>
ngOnInit() {
this.form = this.fb.group({
... some other fields
SELECTBOX_VALUE: [null, Validators.required]
});
Autocomplateのフィルターコードは次のとおりです。
this.form.get('SELECTBOX_VALUE').valueChanges
.pipe(
startWith(''),
map(option => secenek ? this.doFilter(option) : this.options.slice())
);
doFilter (name: string) {
return this.myOptions.filter(option =>
option.name.toLowerCase().indexOf(name.toLowerCase()) === 0);
}
同様のアプローチが必要な人向け。これが私の解決策です。必要に応じてカスタム検証ルールを作成しました。
SELECTBOX_VALUE: [null, Validators.compose(
[Validators.required, FormCustomValidators.valueSelected(this.myArray)]
)]
export class FormCustomValidators {
static valueSelected(myArray: any[]): ValidatorFn {
return (c: AbstractControl): { [key: string]: boolean } | null => {
let selectboxValue = c.value;
let pickedOrNot = myArray.filter(alias => alias.name === selectboxValue);
if (pickedOrNot.length > 0) {
// everything's fine. return no error. therefore it's null.
return null;
} else {
//there's no matching selectboxvalue selected. so return match error.
return { 'match': true };
}
}
}
}