Ionic 4 Refresher调用complete报错及ViewChild使用问题求助
解决Ionic 4中Refresher的
TypeError: refresher.complete is not a function问题 我来帮你一步步解决这个问题,先理清报错的根源,再给出具体的修复方案:
问题根源分析
- Ionic 4的
ionRefresh事件传递的不是Refresher实例:你原来的代码里直接把$event当成Refresher组件调用complete(),但实际上Ionic 4的ionRefresh触发时传递的是一个CustomEvent,event.target才是真正的Refresher组件实例,所以直接调用refresher.complete()会提示“不是函数”。 @ViewChild的语法错误:Ionic 4基于Angular 8+,这个版本要求@ViewChild必须传入第二个参数(指定static属性),否则会报参数缺失的错误。- 未正确导入Refresher组件:你的代码里没有导入
Refresher类,导致TypeScript提示“找不到名称'Refresher'”。
方案一:直接通过事件目标获取Refresher实例(推荐,更简洁)
这种方式不需要用到@ViewChild,直接从事件对象中拿到Refresher组件:
1. 修改HTML模板
<ion-refresher slot="fixed" (ionRefresh)="load($event)"> <ion-refresher-content pullingIcon="arrow-dropdown" pullingText="Pull to refresh" refreshingSpinner="circles" refreshingText="Refreshing..."> </ion-refresher-content> </ion-refresher>
2. 修改TS文件的load方法
// 先确保导入Refresher(提供类型提示,推荐) import { Refresher } from '@ionic/angular'; load(event) { // 从事件目标获取Refresher实例 const refresher = event.target as Refresher; let postData = new FormData(); postData.append('user_id', this.userData.userId); this.authService.postData(postData, "is_verified_or_not.php").then((result) => { this.responseData = result; this.success = this.responseData.success; if (this.success == 1) { let userDeatil = this.responseData.users_details; // 处理你的用户数据逻辑 } else { this.message = this.responseData.message; this.showToast(this.message); } // 结束刷新状态 refresher.complete(); }, (err) => { console.log("Error", err); refresher.complete(); }); }
方案二:使用@ViewChild获取Refresher实例
如果你更倾向于用@ViewChild的方式,按以下步骤修复:
1. 导入Refresher和ViewChild
在页面TS文件顶部添加导入:
import { Refresher, ViewChild } from '@ionic/angular';
2. 修正@ViewChild的写法
添加static参数(刷新是用户触发的操作,这里用false即可):
@ViewChild("refresherRef", { static: false }) refresherRef: Refresher;
3. 修改HTML模板和load方法
模板里不需要传递$event了:
<ion-refresher #refresherRef slot="fixed" (ionRefresh)="load()"> <ion-refresher-content pullingIcon="arrow-dropdown" pullingText="Pull to refresh" refreshingSpinner="circles" refreshingText="Refreshing..."> </ion-refresher-content> </ion-refresher>
TS方法里直接调用this.refresherRef.complete():
load() { let postData = new FormData(); postData.append('user_id', this.userData.userId); this.authService.postData(postData, "is_verified_or_not.php").then((result) => { this.responseData = result; this.success = this.responseData.success; if (this.success == 1) { let userDeatil = this.responseData.users_details; // 处理你的用户数据逻辑 } else { this.message = this.responseData.message; this.showToast(this.message); } // 结束刷新状态 this.refresherRef.complete(); }, (err) => { console.log("Error", err); this.refresherRef.complete(); }); }
这两种方案都能解决你遇到的三个错误:事件传递错误、@ViewChild参数缺失、Refresher未导入的问题。
内容的提问来源于stack exchange,提问作者Unnati Patadia
相关产品推荐
相关产品推荐

