typescript - Hur man visar sökresultat i primeng-dropdown


Jag försöker visa sökresultat efter att den inmatade textens längd är mer än 3. Om textens längd är mindre än 3 vill jag dölja området för sökresultat. Jag kan bara använda inputId som identifierare. Hur kan jag uppnå detta i en priming dropdown?

app.component.html:

<p-dropdown 
  [options]="cars"
  inputId="listDDOne"
  [(ngModel)]="selectedCar"
  [style]="{'width':'100%'}"
  scrollHeight="400px"
  filter="true"
  resetFilterOnHide="true"
  (keydown.enter)="MyKeydownEnter($event)"
  (keydown)="MyKeydown($event)"
  (onChange)="OnChange($event)">
  <ng-template let-item pTemplate="selectedItem">
    {{item.label}}
   </ng-template>
   <ng-template let-car pTemplate="item">
    <div class="drop-item"
      (click)="MyItemClick($event)">

      <span class="drop-item-label"
        [ngClass]="car.disabled ? 'disabled' : ''">
        {{car.label}}
      </span>

      <span class="drop-item-value"
        [ngClass]="car.disabled ? 'disabled' : ''">
        {{car.value}}
      </span>
    </div>
    </ng-template>    
 </p-dropdown>

app.component.ts:

MyKeydown(event) {
console.log("MyKeydown", event.value);

if(event.value.length>3){ 
  event.stopPropagation();
  event.preventDefault(); 

  ????
} 
}

stackblitz-demo

Svar #1

Du kan använda [hidden] för detta.

Returnera bara ett boolean om längden är >= 3.

[hidden]="ShowDropdown($event)"

App-komponent:

ShowDropdown(event) {
    return event.value.length >= 3;
    //same as 
    //return event.value.length >= 3 ? true : false;
}

Eller bädda in det i HTML (bör vara motsvarande) :

[hidden]="$event.value.length >=3"

Svar #2

Jag tycker primeng autocomplete är bättre här än att försöka få dropdown-komponenten att fungera som autocomplete, med autocomplete-komponenten kan du ställa in minimilängden på textfrågan

mall

<p-autoComplete 
   [minLength]="3" 
   [dropdown]="true" 
   [(ngModel)]="selectedValue" 
   field="label" 
   [suggestions]="result" 
   (completeMethod)="search($event)" >
</p-autoComplete>

du behöver bara tillhandahålla sökmetoden som detta

komponent

  search({ query = "" }) {
    if (query == "") {
      this.result = [...this.cars];
    } else {
      this.result = this.cars.filter(c =>
        c.label.toLowerCase().includes(query.toLowerCase())
      );
    }
  }

demo 🚀