【问题标题】:ionic3 set timeout for ion-input on searching addressionic3 在搜索地址时设置离子输入超时
【发布时间】:2020-08-02 14:24:27
【问题描述】:

当用户在 ion-input 上输入地址时,我想 setTimeout 500 毫秒,而不是继续为每个 keyup 调用 http 请求。如果我在键盘上按 15 次,它现在正在做的是继续调用 http 请求 15 次。每次搜索新地址时,我都想清除数组中的所有内容,但现在没有被清除。现在我 Ctrl+V 粘贴地址,所以会有两次按键和 searchAddress() 将被调用两次,并且第一次 addressSearchRslts 数组没有被清除,如下图所示:

这是调用 searchAddress() 时的控制台输出:

我想要的是 '1/84 solomon rd' 应该只调用 searchAddress() ONCE

我知道这是因为按键行为而被调用了两次。有什么方法可以通过使用 setTimeout() 实现一次 searchAddress() 调用

我的 .ts

@ViewChild('addressInput') addressInput;

addressSearchRslts = [];
searchAddress:string;

searchAddress(event: any){
    setTimeout(()=>{
      this.addressInput.setFocus();
    }, 500);
    this.addressSearchRslts.length=0;
    if(this.searchAddress.length<1){
      return;
    }
    this._service.searchAddress(this.searchAddress).subscribe(
      success=>{
        let searchRslts=success.addresses.slice(0, 100);
        searchRslts.forEach( (result )=>{
          let address = result;
          let addressInfo = address.house_number+' '+address.street+', '+address.district+' '+address.state+' '+address.postal_code+' '+address.country;
          this.addressSearchRslts.push( {data:address, title:addressInfo});
        });
      },err => console.log(err),
      () => console.log('search address finish')
    );
}

selectAddress(data){
    this.address.setValue(data.house_number+' '+data.street);
    this.city.setValue(data.district);
    this.state.setValue(data.state);
    this.postcode.setValue(data.postal_code);
    this.addressSearchRslts.length=0;
}

我的html

<ion-item>
      <ion-label stacked>Address</ion-label>
      <ion-input #addressInput id="addressField" type="text" formControlName="address" [(ngModel)]="searchAddress" (keyup)="searchAddress($event)"></ion-input>
</ion-item>
<div *ngIf="addressSearchRslts.length>0">
      <ion-item *ngFor="let addressSearchRslt of addressSearchRslts" (click)="selectAddress(addressSearchRslt.data)">
        <p ion-text text-wrap>{{addressSearchRslt.title}}</p> 
      </ion-item>
</div>

【问题讨论】:

标签: angular ionic-framework ionic3 settimeout


【解决方案1】:

将您的服务调用移动到 settimeout 并使用一个布尔值来检查服务是否已被调用,使用这种方法,您的服务应该每 500 毫秒调用一次,而不管您按下了多少键

  @ViewChild('addressInput') addressInput;

  addressSearchRslts = [];
  searchAddress: string;
  searchCalled = false;

  searchAddress(event: any) {
    if (!this.searchCalled) {
      this.searchCalled = true;
      setTimeout(() => {
        this.addressInput.setFocus();
        this.addressSearchRslts.length = 0;
        if (this.searchAddress.length < 1) {
          return;
        }
        this._service.searchAddress(this.searchAddress).subscribe(
          success => {
            let searchRslts = success.addresses.slice(0, 100);
            searchRslts.forEach((result) => {
              let address = result;
              let addressInfo = address.house_number + ' ' + address.street + ', ' + address.district + ' ' + address.state + ' ' + address.postal_code + ' ' + address.country;
              this.addressSearchRslts.push({ data: address, title: addressInfo });
            });
          }, err => console.log(err),
          () => console.log('search address finish')
        );
        this.searchCalled = false;
      }, 500);
    }
  }

  selectAddress(data) {
    this.address.setValue(data.house_number + ' ' + data.street);
    this.city.setValue(data.district);
    this.state.setValue(data.state);
    this.postcode.setValue(data.postal_code);
    this.addressSearchRslts.length = 0;
  }

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    相关资源
    最近更新 更多