私は ngx-progressbar を使用していますが、サービス、コンポーネント、またはリゾルバ内から開始された http リクエストで正常に動作します。
http リクエスト中に (サービスなどを介して) プログレス バーを手動でトリガーする必要がないことに注意してください。自動的にトリガーされます。
残念ながら、NGXS State 内から http リクエストを行うと、期待どおりに動作しません。
すべてのケースにボタンを作成しました:
- 「依頼する(店舗への発送、ゾーンなし)」
これは機能せず、プログレス バーが表示されません (または、表示されてもハングし、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 リクエストで進行状況バーを表示したいので、これを解決する正しいアプローチは何でしょうか?
zone 内ですべての http リクエストを実行するように NGXS に指示する方法はありますか?