我正在尝试制作一个自定义的http拦截器,用于处理加载和其他附加功能。(为每个请求手动处理加载会显着增加代码量)。
问题在于:加载程序在每个请求上都被激活,但loading.dismiss()
不起作用。(加载旋转器仍然处于活动状态,没有错误)
我的配置:
http拦截器:
@Injectable()
export class MyHttpWrapper extends Http {
private loading: any;
constructor(connectionBackend: ConnectionBackend, requestOptions: RequestOptions,private loadingCtrl: LoadingController) {
super(connectionBackend, requestOptions);
}
public get(url: string, options?: RequestOptionsArgs): Observable<Response> {
this.showLoader();
return super.get(url, this.getRequestOptionArgs(options))
.finally<Response>(() => {
this.hideLoader();
});
}
public post(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> {
return super.post(url, body, options);
}
public put(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> {
return super.put(url, body, options);
}
public delete(url: string, options?: RequestOptionsArgs): Observable<Response> {
return super.delete(url, options);
}
private getRequestOptionArgs(options?: RequestOptionsArgs) : RequestOptionsArgs {
if (options == null) {
options = new RequestOptions();
}
if (options.headers == null) {
options.headers = new Headers();
}
options.headers.append('Content-Type', 'application/json');
return options;
}
private showLoader() {
if(!this.loading){
this.loading = this.loadingCtrl.create({
dismissOnPageChange: true
});
}
this.loading.present();
console.log('show loader')
}
private hideLoader() {
console.log('hide loader')
console.log(this.loading)
this.loading.dismiss();
}
}
app.module.ts
export function httpInterceptorFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions, loadingCtrl: LoadingController) {
return new MyHttpWrapper(xhrBackend, requestOptions, loadingCtrl);
}
@NgModule({
declarations: [
MyApp
],
imports: [
BrowserModule,
HttpModule,
IonicModule.forRoot(MyApp),
IonicStorageModule.forRoot()
],
bootstrap: [IonicApp],
entryComponents: [
MyApp
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
{provide: APP_CONFIG, useValue: AppConfig},
{
provide: Http,
useFactory: httpInterceptorFactory,
deps: [XHRBackend, RequestOptions, LoadingController]
}
]
})
export class AppModule {}
更新:
尝试添加简单服务(并在MyHttpWrapper
中使用它),但没有改变任何内容,仍然存在同样的问题。
@Injectable()
export class LoadingService {
private loading:any;
constructor(private loadingCtrl: LoadingController) {
}
show() {
if(!this.loading){
this.loading = this.loadingCtrl.create({
dismissOnPageChange: true
});
}
this.loading.present();
}
hide() {
if (this.loading) {
this.loading.dismiss();
}
}
}
private static loading: any;
。 - DuannxMyHttpWrapper
设置为单例的理由。虽然在providers
中导入了单例的LoadingService
,但这并没有改变什么。 - user1935987MyHttpWrapper
的一个实例,并且它与显示加载的实例不同,因此它无法解除加载。 - Duannx