Search code examples
angularangular5angular7angular-ngselect

How to search value in ngselect?


From Api, I get the countryName and code as like below

eg:-

  countryName        code
  -----------------------
  India              IND
  United States      USA
  Aruba              ABW

I want to use the ngSelect dropdown and want to display the value like countryName (code) in dropdown.

eg: India (IND)

Question:- I want concatenate the countryName and code. And want to filter the dropdown value based on both countryName and code. Below is the code which I tried. But its not working properly

component.html

  <ng-select [items]="countries" bindLabel="description" bindValue="code"
           clearAllText="Clear" formControlName="countryCode"
          [searchFn]="customSearchFn">
      <ng-template ng-label-tmp let-item="item">
          <span >{{ item.countryName + ' (' + item.code + ')' }}</span>
      </ng-template>
      <ng-template ng-option-tmp let-item="item" let-search="searchTerm" let-index="index">
           <span >{{ item.countryName + ' (' + item.code + ')' }}</span>
      </ng-template>
   </ng-select>

component.ts

getCountry() {
this.lookupService.getCountry().subscribe(
  data => {
    this.countries = data;
  });
 }

customSearchFn

customSearchFn(term: string, item: Lookup) {
  term = term.toLocaleLowerCase();
  return item.code.toLocaleLowerCase().indexOf(term) > -1 || item.countryName.toLocaleLowerCase() === term;
   }

Can anybody give me a solution for Searching?


Solution

  • I took your code and put it into a Stackblitz. It actually almost worked! I just made a minor change in the search function:

    customSearchFn(term: string, item: any) {
        term = term.toLocaleLowerCase();
        return item.code.toLocaleLowerCase().indexOf(term) > -1 || 
               item.countryName.toLocaleLowerCase().indexOf(term) > -1;
    }
    

    (both countryName and code use indexOf instead of item.countryName.toLocaleLowerCase() === term)

    The only other thing I removed was formControlName="countryCode", that gave me an error "No provider for NgControl". The error makes sense, I have not implemented an NgControl.

    Now, ABW gives you Aruba and Aru gives you Aruba too. (That's what you want, right?)