RxJSに慣れようとしていて、角度2+とRxJSが新しくなりました。ナビゲーションを表示ローダースピナーと角度2の遅れ+
私はルートの移行にかかる負荷スピナーを示したが、それはある程度の時間、より多くを要する場合にのみ、ラッツは160msで
を言って、私は店をngrxするサブスクリプションに、別の成分として、負荷スピナーを持っているので、私は/非表示の負荷を示し、私のアプリのルートコンポーネントで痛みの値に基づいてスピナー(showSpinner)
、私は変更イベントをルータにサブスクライブ、およびディスパッチアクション(SHOW_SPINNER/HIDE_SPINNER)
そこで質問があり、それを達成するための簡単な方法はあります?ここで
は、私のコードの一部
....
export const navigationStreamForSpinnerStatuses = {
NAVIGATION_STARTED: 'NAVIGATION_STARTED',
NAVIGATION_IN_PROGRESS: 'NAVIGATION_IN_PROGRESS',
NAVIGATION_ENDED: 'NAVIGATION_ENDED'
};
です....
private navigationStartStream;
private navigationStartStreamWithDelay;
private navigationFinishStream;
constructor(private store: Store<IAppState>, private router: Router) {
this.navigationStartStream = router.events
.filter(event => {
return event instanceof NavigationStart;
})
.map(() => navigationStreamForSpinnerStatuses.NAVIGATION_STARTED);
this.navigationStartStreamWithDelay = this.navigationStartStream
.delay(160)
.map(() => navigationStreamForSpinnerStatuses.NAVIGATION_IN_PROGRESS);
this.navigationFinishStream = router.events
.filter(event => {
return event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError;
})
.map(() => navigationStreamForSpinnerStatuses.NAVIGATION_ENDED);
this.navigationStartStream
.merge(this.navigationFinishStream)
.merge(this.navigationStartStreamWithDelay)
.pairwise()
.subscribe([previousStatus, currentStatus] => {
if (previousStatus !== navigationStreamForSpinnerStatuses.NAVIGATION_ENDED && currentStatus === navigationStreamForSpinnerStatuses.NAVIGATION_IN_PROGRESS) {
this.store.dispatch({ type: StateLoaderSpinnerActionsTypes.SHOW_SPINNER });
} else if (previousStatus === navigationStreamForSpinnerStatuses.NAVIGATION_IN_PROGRESS && currentStatus === navigationStreamForSpinnerStatuses.NAVIGATION_ENDED) {
this.store.dispatch({ type: StateLoaderSpinnerActionsTypes.HIDE_SPINNER });
}
});
}
どのように役立ちますか? navigationStartStreamが送出された後、全体のnavigationStartStreamWithDelayストリームをキャンセルしないのですか? –
@MykhailoI申し訳ありません私はあまり変わらないようにしていました。私が上記で行った編集を見て、それがもっと明確であるかどうか教えてください。 – ChrisG
ありがとう、それは明らかです。 SHOW_SPINNERがディスパッチされなかった場合、HIDE_SPINNERをディスパッチしない方法があるのでしょうか? 私はロードスピナーをリファクタリングして後でそれを一般的なものにしたいので、他のネットワークリクエストにも使うことができます 店内にいくつかのカウンタを追加することを考えていて、カウンタがゼロの場合のみshowSpinnerをfalseに変更します。 そのため、以前のSHOW_SPINNERを使用しないでHIDE_SPINNERを追加すると、そのロジックが破損し、 となり、ネットワークロードスピナーとルーティングロードスピナーを区別するために店舗にいくつかのプロパティを導入する必要があります またはその他の回避策 –