gpt4 book ai didi

javascript - 显示具有 Angular 延迟的导航加载器微调器 2+

转载 作者:太空狗 更新时间:2023-10-29 17:57:08 24 4
gpt4 key购买 nike

我是 Angular 2+ 和 RxJS 的新手,正在努力适应 RxJS。

我在路线转换上显示负载微调器,但前提是它需要超过一定数量的时间,lats 说 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 });
}
});
}

最佳答案

我的方法基于 Http 请求,这可能不适用于所有情况,因为某些应用程序将仅使用 WebSockets 或根本不使用外部请求。但是对于大量应用程序,他们通过 HttpClient (angular 4.3+) 获取所有数据。我编写了一个 HttpInterceptor 来执行此操作。

import { HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http'
import { Inject, Injectable, RendererFactory2 } from '@angular/core'
import { Observable, timer } from 'rxjs'
import { filter, takeUntil, tap } from 'rxjs/operators'
import { DOCUMENT } from '@angular/common'

const reqIsSpinnable = (req: HttpRequest<any>) => {
return req.url.includes('api/')
}

@Injectable()
export class HttpSpinnerInterceptor implements HttpInterceptor {
constructor(@Inject(DOCUMENT) private doc: HTMLDocument, private rdf:
RendererFactory2) { }

// tslint:disable-next-line:no-null-keyword
readonly rdr = this.rdf.createRenderer(null, null)

get spinnerElement() {
return this.doc.querySelector('#core-spin')
}

startSpin() {
this.rdr.setStyle(this.spinnerElement, 'display', 'block')
}

closeSpin() {
this.rdr.setStyle(this.spinnerElement, 'display', 'none')
}

intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<any> {
const responseTimer$ = next.handle(req).pipe(filter(e => e instanceof HttpResponse))
timer(120).pipe(takeUntil(responseTimer$)).subscribe(() => this.startSpin())

return next.handle(req).pipe(tap(evt => {
if (reqIsSpinnable(req) && evt instanceof HttpResponse) {
this.closeSpin()
}
}))

}

关于javascript - 显示具有 Angular 延迟的导航加载器微调器 2+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com