Rin and Len
Rin and Len

Reputation: 507

Angular 6: how to access ALL option values in mat-autocomplete dropdown?

Given the example in the Angular docs you can see here and also repeated below, how can I access the rest of the object data in options?

If for example, the object was more than just a simple list of names in key:value format, but something more complex such as data coming in from an API:

dataObject = {
  name: 'someName',
  nameID: 'someId',
  foo: 'bar'
  }

The example in the docs is too simple and isn't telling me how to get the name to display in the input field, and to also get the corresponding nameId in the ts file needed to return a PUT request via the API.

<form class="example-form">
  <mat-form-field class="example-full-width">
    <input type="text" placeholder="Assignee" aria-label="Assignee" matInput [formControl]="myControl" [matAutocomplete]="auto">
    <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn">
      <mat-option *ngFor="let option of filteredOptions | async" [value]="option">
        {{option.name}}
      </mat-option>
    </mat-autocomplete>
  </mat-form-field>
</form> 

component.ts:

export class AutocompleteDisplayExample implements OnInit {
  myControl = new FormControl();
  options: User[] = [
    {name: 'Mary'},
    {name: 'Shelley'},
    {name: 'Igor'}
  ];
  filteredOptions: Observable<User[]>;

  ngOnInit() {
    this.filteredOptions = this.myControl.valueChanges
      .pipe(
        startWith<string | User>(''),
        map(value => typeof value === 'string' ? value : value.name),
        map(name => name ? this._filter(name) : this.options.slice())
      );
  }

  displayFn(user?: User): string | undefined {
    return user ? user.name : undefined;
  }

  private _filter(name: string): User[] {
    const filterValue = name.toLowerCase();

    return this.options.filter(option => option.name.toLowerCase().indexOf(filterValue) === 0);
  }
}

Upvotes: 3

Views: 1877

Answers (1)

Swoox
Swoox

Reputation: 3740

I think you're looking for the onSelectionChange option:

You can simple add, to the mat-option:

(onSelectionChange)="setID(option.nameID)"

Everytime when you select a value this will be triggered.

Upvotes: 2

Related Questions