【发布时间】: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>
【问题讨论】:
-
您正在寻找的是离子输入的去抖,这里是一个很好的指令示例,您可以实现此指令forum.ionicframework.com/t/…
标签: angular ionic-framework ionic3 settimeout