如何在 angular material 的多 select 下拉列表中实现搜索功能

How to implement search functionality in multi select drop down of angular material

我正在做一个项目,我需要使用多个 select 下拉列表来实现搜索。当我添加下面的代码时,我可以搜索但是我之前 selected 的值在新搜索后消失了。

下面是代码片段。

HTML:

<mat-form-field appearance="fill">
    <mat-label>Providers</mat-label>
    <mat-select  multiple [formControl]="providers">
      <mat-select-trigger>
        {{providers.value  }}
      </mat-select-trigger>
      <input type="text"  autocomplete="off" matInput placeholder="Search By Provider" #multiUserSearch ( 
 input)="onInputChange()">
     
      <mat-option *ngFor="let provider of provider " [value]="provider.PROV">{{provider.PROV}} 
</mat-option>
</mat-select>

TS 文件:

onInputChange(){
        console.log(this.multiUserSearchInput.nativeElement.value);
        const searchInput=this.multiUserSearchInput.nativeElement.value?
        this.multiUserSearchInput.nativeElement.value.toLowerCase():'';
        
          this.provider=this._provider.filter(u=>{
            const PROV:string=u.PROV.toLowerCase().;
            return PROV.indexOf(searchInput) > -1;
          });           
      
      } 

你能帮帮我吗

由于您使用过滤列表为下拉列表提供值,一旦过滤列表不再包含该值,它就会重置。

使用你的代码,你可能应该使用类似的东西:

HTML:

<mat-form-field appearance="fill">
  <mat-label>Providers</mat-label>
  <mat-select multiple [formControl]="providers" (openedChange)="onOpenChange(multiUserSearch)">
    <mat-select-trigger>
      {{providers.value }}
    </mat-select-trigger>
    <input #multiUserSearch type="text" autocomplete="off" matInput placeholder="Search By Provider" (input)="onInputChange($event)"/>

    <mat-option *ngFor="let provider of filteredProviders" [value]="provider.PROV">{{provider.PROV}}</mat-option>
  </mat-select>
</mat-form-field>

组件:

export class SelectMultipleExample {
  providers = new FormControl();
  allProviders: any[] = [{ PROV: "aaa" }, { PROV: "aab" }, { PROV: "aac" }];
  filteredProviders: any[] = this.allProviders;

  onInputChange(event: any) {
    const searchInput = event.target.value.toLowerCase();

    this.filteredProviders = this.allProviders.filter(({ PROV }) => {
      const prov = PROV.toLowerCase();
      return prov.includes(searchInput);
    });
  }

  onOpenChange(searchInput: any) {
    searchInput.value = "";
    this.filteredProviders = this.allProviders;
  }
}

Stackblitz Demo

也就是说,不确定我是否会自己实现这样的功能,因为这里有很多边缘情况。您可能应该使用现有的库来这样做。