我正在使用 ngx-progressbar,它可以很好地处理从服务、组件或解析器内部启动的 http 请求。
请注意,在 http 请求期间不需要手动触发进度条(通过服务等)。它是自动触发的。
不幸的是,当从 NGXS State 中发出 http 请求时,它无法按预期工作:
堆栈闪电战 https://stackblitz.com/edit/ngx-progressbar-bat5zp?file=src%2Fapp%2Fngxs.ts :
我为每种情况创建了一个按钮:
这确实not工作,没有出现进度条(或者出现但挂起并且未完成 100%)
@Action(LoadUrl)
load({ setState }: StateContext<string>) {
return this.http.get<any>('https://jsonplaceholder.typicode.com/posts/1').pipe(tap(res => console.log(res)));
}
这确实按预期工作,出现进度条
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
// ...
makeRequestComponent() {
this.http.get<any>('https://jsonplaceholder.typicode.com/posts/1').pipe(tap(res => console.log(res))).subscribe();
}
}
我询问了 ngx-progressbar 的开发人员,他实际上发现了这个问题,并通过将 http 调用包装在区域内来解决它。这确实有效,出现进度条:
@State<string>({
name: 'testState',
defaults: ''
})
export class TestUrlState {
constructor(private http: HttpClient, private zone: NgZone) { }
@Action(LoadUrl)
load({ setState }: StateContext<string>) {
this.zone.run(() => {
this.http.get<any>('https://reqres.in/api/users?delay=2').pipe(
tap(res => console.log(res))
).subscribe();
});
}
}
由于我希望每个 http 请求都出现进度条,那么解决此问题的正确方法是什么?
有没有办法告诉 NGXS 在区域内运行每个 http 请求?