我想现在我要去与此解决方案:
ngOnInit() {
let timer: any;
this.router.events
.subscribe(event => {
if (event instanceof NavigationStart) {
clearTimeout(timer);
timer = setTimeout(() => this.isLoading = true, 250);
} else if (event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError) {
clearTimeout(timer);
this.isLoading = false;
}
});
}
如果某人发布的清洁RxJs方式要去一下吧,我会注意,
编辑:基于@ KeniSteward的答案,我能得到这个解决方案的工作:
this.router.events
.filter(event => event instanceof NavigationStart || event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError)
.debounceTime(250)
.filter(event => event instanceof NavigationStart)
.subscribe(event => this.isLoading = true);
this.router.events
.filter(event => event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError)
.subscribe(event => this.isLoading = false);
编辑#2:即使清洁 -
this.router.events
.filter(event => event instanceof NavigationStart || event instanceof NavigationEnd || event instanceof NavigationCancel || event instanceof NavigationError)
.do(event => this.isLoading = false)
.debounceTime(250)
.filter(event => event instanceof NavigationStart)
.subscribe(event => this.isLoading = true);
由于狄波拉导航起点 - 我觉得这个解决方案依赖于用户的机器/浏览器,只要他们最终看到了。如果可能的话,我想用特定的去抖时间对它进行更多的控制 – John
500ms超时将不会以这种方式处理。最好的方法是使用rxjs .debounce(500)作为下面建议的@KeniSteward。你可以有一个回调手动处理超时,但RxJs已经提供了处理它的功能。 –