【发布时间】:2018-01-07 20:09:51
【问题描述】:
我正在尝试制作一个自定义的 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; -
相同。实际上我认为那不是很正确 - 每个类的实例都必须具有此属性是唯一的
-
我认为一次只需要一个实例,因为您应该一次显示一个加载。尝试应用 singleton pattern 一次只归档一个
MyHttpWrapper实例 -
真的没有理由让
MyHttpWrapper成为单身人士。做了一个单例LoadingService(在providers中导入),但这并没有改变任何事情。 -
我认为当您订阅 Observable 时,会创建一个
MyHttpWrapper的实例,它与显示加载不同,因此它无法关闭加载
标签: javascript angular typescript ionic2