使用settimeout从下拉列表中的后端返回数据

时间:2019-10-14 11:11:08

标签: javascript angular observable settimeout

我对后端执行api调用以填充下拉列表,并且它可以正常工作。但是问题在于,仅当用户在下拉列表上单击两次时,数据才会显示在下拉列表中。但是在控制台中,单击一次下拉列表后,我看到数据已加载。

所以我尝试使用setTimeout。但这不起作用。

这是api调用:


  getQrCodes() {
    setTimeout(() => {
      this.returnQrCodes$ = this.qrCodeDefinitonService.getDefinitionForSelection()
          .pipe(tap(console.log));
    }, 1000);
  }

这是模板:

<div class="search-select searchoptions"  
    *ngIf=" selectedSearch && hasOtherOptions(selectedSearch)">
    <mat-select placeholder="Opties" name="option" 
         [(ngModel)]="selectedValueOptie" (click)="getQrCodes()">
            <mat-option *ngFor="let option of (returnQrCodes$ | async)" 
                value="option.value"> {{ option.qrCode }} </mat-option>
          </mat-select>
        </div>

所以我的问题是:如果只单击一次,如何在下拉列表中显示数据?

谢谢

2 个答案:

答案 0 :(得分:0)

尝试使用 change 事件属性:

  getQrCodes() {
      this.returnQrCodes$ = this.qrCodeDefinitonService.getDefinitionForSelection()
          .pipe(tap(console.log));
  }


<div class="search-select searchoptions"  
    *ngIf=" selectedSearch && hasOtherOptions(selectedSearch)">
    <mat-select placeholder="Opties" name="option" 
         [(ngModel)]="selectedValueOptie" (change)="getQrCodes()">
            <mat-option *ngFor="let option of (returnQrCodes$ | async)" 
                value="option.value"> {{ option.qrCode }} </mat-option>
          </mat-select>
        </div>

答案 1 :(得分:0)

第一次单击时,选择控件中没有任何选项,因此不会尝试打开面板。然后,您的异步方法会将这些选项加载到DOM中,然后在下次单击时将其打开。

因此,请尝试在您的<mat-option>中至少包含一个<mat-select>

<mat-select placeholder="Opties" name="option" 
     [(ngModel)]="selectedValueOptie" (click)="getQrCodes()">
        <mat-option *ngFor="let option of returnQrCodes$ | async as codes" 
            value="option.value"> {{ option.qrCode }} </mat-option>
        <mat-option *ngIf="!codes"
            value="empty">Data is loading</mat-option>
      </mat-select>
    </div>