Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular Material: How to validate Autocomplete against suggested options?

We have an autocomplete input with required validation. When a user searches for an option by entering a query (but doesn't pick any of the options) then the input is valid, even though it doesn't match any of the suggested options.

What I want to achieve is not permitting the user to post the form unless one of the suggested options is selected. How do I achieve this?

<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]     }); 

My filter code for Autocomplate is pretty straight forward:

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); } 
like image 432
klevendoglu Avatar asked Aug 16 '18 07:08

klevendoglu


People also ask

How does angular validate autocomplete?

Create custom validator for autocomplete Working with reactive forms, the easiest way to solve this issue is to write a custom form validator. This function evaluates the value of a control and return a validation error if the value is a string type.

How do you clear mat autocomplete when no option is selected from autocomplete dropdown?

Answers 1 : of How to clear mat- autocomplete when no option is selected from autocomplete dropdown. You can remove the formControl-binding from your input and when you select an option you set that id to your form.


1 Answers

For those who may need a similar approach. Here's my solution. I've built a custom validation rule according to my needs.

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 };       }     };   } } 
like image 169
klevendoglu Avatar answered Sep 20 '22 05:09

klevendoglu