同步随时间变化的服务变量的变化angular 10
Synchronize changes of service variable that changes in time angular 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,然后变为false,这一切在5秒的时间段内花费了剩余的API来带数据。
加载变量最初与加载变量同步为false,但后来不跟随加载变量的状态,加载变量保持为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 class.
上提到的 public 变量 'loading'
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>
请参考:
我能够解决问题,我在同一个ts文件中创建了classes,这样它更有秩序,一个class负责拦截逻辑,另一个class 负责监听 http 请求,我检查了很多解决方案,但这是我最喜欢的一个,因为它 returns 对 html 是对还是错而不需要使用依赖项.
这是你使用的服务的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 中
import { interceptHttpService, spinnerService } from './services/spinner.service';
我正在尝试在 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,然后变为false,这一切在5秒的时间段内花费了剩余的API来带数据。
加载变量最初与加载变量同步为false,但后来不跟随加载变量的状态,加载变量保持为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 class.
上提到的 public 变量 'loading'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>
请参考:
我能够解决问题,我在同一个ts文件中创建了classes,这样它更有秩序,一个class负责拦截逻辑,另一个class 负责监听 http 请求,我检查了很多解决方案,但这是我最喜欢的一个,因为它 returns 对 html 是对还是错而不需要使用依赖项.
这是你使用的服务的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 中
import { interceptHttpService, spinnerService } from './services/spinner.service';