如何解决同步随时间角度10变化的服务变量的变化
我正在尝试在Angular 10
中使用以下服务,该服务用于查找正在进行的HTTP请求,如果有HTTP请求,则该服务从true更改为false,这样做很好,我检查它与控制台日志
export class SpinnerService implements HttpInterceptor {
public loading: boolean = false;
constructor() {}
intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
this.loading = true;
// console.log('estado spinner: >> ',this.loading);
return next.handle(req).pipe(
finalize(() => {
this.loading = false;
// console.log('todas solicitudes ok');
console.log('estado espinner: >>',this.loading);
})
);
}
}
当我尝试在另一个组件中使用该服务时,我遇到了问题,因为该服务未与该组件的本地变量同步。 例如,服务的加载变量开始为false,然后变为true,然后在5秒钟的时间内变为false,这需要花费API的其余部分来带来数据。
load变量最初与load变量同步为false,但随后不跟随load变量的状态,因此load变量保持为false
如何同步这些变量?请帮忙,我不知道如何搜索
public carga = this._spinnerService.loading;
constructor(private _spinnerService: SpinnerService)
{
this.crearFormulario(); // inicializar formulario
// this._spinnerService.loading = this.spinneres;
// console.log('estado inicial spinner: >>',this._spinnerService.loading);
console.log('estado inicial spinner: >>',this.carga);
}
解决方法
我认为您要展示的是对您的应用程序进行的每个http网络调用的微调。如果是这种情况,除了您在SpinnerService类上提到的公共变量“加载”之外,您几乎是正确的。
import { NgxSpinnerService } from 'ngx-spinner';
export class SpinnerService implements HttpInterceptor{
constructor(private spinner: NgxSpinnerService) { }
intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>>
{
this.spinner.show();
return next.handle(req).pipe(
finalize(() => {
this.spinner.hide();
}
)
);
}
}
请安装
npm i ngx-spinner
在您app.component.ts
<ngx-spinner></ngx-spinner>
请参考:
https://www.npmjs.com/package/ngx-spinner
,我能够解决问题,我在同一个ts文件中创建了类,以使它们更加有序,一个类负责拦截逻辑,另一个类负责侦听http请求,我检查了许多解决方案,但这是我最喜欢的解决方案,因为它无需使用依赖项即可将html返回true或false。
这是您使用的服务的ts文件,只需要将服务导入要使用微调器的组件中即可。
import { Injectable } from '@angular/core';
import { HttpInterceptor,HttpRequest,HttpHandler,HttpEvent,HttpResponse,HttpErrorResponse } from '@angular/common/http';//para interceptor de http
import { BehaviorSubject,Observable } from 'rxjs';//para interceptor de http
import { tap } from 'rxjs/operators';//para interceptor de http
@Injectable({
providedIn: 'root'
})
//servicio interceptor que escucha si hay solicitudes http en progreso
export class interceptHttpService implements HttpInterceptor{
constructor(private _pruebaspinerss3 : spinnerService ) { }
intercept(request: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>>
{
this._pruebaspinerss3.requestStarted();
return this.handler(next,request);
}
handler(next,request)
{
return next.handle(request)
.pipe(
tap(
(event) =>{
if (event instanceof HttpResponse){
this._pruebaspinerss3.requestEnded();
}
},(error: HttpErrorResponse) =>{
this._pruebaspinerss3.resetSpinner();
throw error;
}
),)
};
}
export class spinnerService{
private count = 0;
private spinner$ = new BehaviorSubject<string>('');
getSpinnerObserver(): Observable<string>{
return this.spinner$.asObservable();
}
requestStarted() {
console.log('spinner activado');
if (++this.count === 1) {
this.spinner$.next('start');
}
}
requestEnded() {
console.log('spinner desactivado');
if (this.count === 0 || --this.count === 0) {
this.spinner$.next('stop');
}
}
resetSpinner() {
console.log('error en solicitud,reset spinner');
this.count = 0;
this.spinner$.next('stop');
}
}
在app.module ts文件中
import { interceptHttpService,spinnerService } from './services/spinner.service';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。