当我在 Angular 2 中更改路线时,如何显示加载屏幕?
原文由 Lucas 发布,翻译遵循 CC BY-SA 4.0 许可协议
当我在 Angular 2 中更改路线时,如何显示加载屏幕?
原文由 Lucas 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新:3 现在我已经升级到新路由器,如果您使用 CanDeactivate
guard, @borislemke 的方法将不起作用。我正在贬低我的旧方法, ie:
这个答案
更新 2:新路由器中的路由器事件看起来很有希望, @borislemke 的 回答 似乎涵盖了微调器实现的主要方面,我还没有测试它,但我推荐它。
UPDATE1: 我在 Old-Router
时代写了这个答案,当时只有一个事件 route-changed
通过 router.subscribe()
9-d23 通知我也觉得下面的方法过载了,并尝试只使用 router.subscribe()
,但 适得其反,因为没有办法检测 canceled navigation
。所以我不得不回到冗长的方法(双重工作)。
如果您熟悉 Angular2,这就是您所需要的
启动.ts
import {bootstrap} from '@angular/platform-browser-dynamic';
import {MyApp} from 'path/to/MyApp-Component';
import { SpinnerService} from 'path/to/spinner-service';
bootstrap(MyApp, [SpinnerService]);
根组件- (MyApp)
import { Component } from '@angular/core';
import { SpinnerComponent} from 'path/to/spinner-component';
@Component({
selector: 'my-app',
directives: [SpinnerComponent],
template: `
<spinner-component></spinner-component>
<router-outlet></router-outlet>
`
})
export class MyApp { }
Spinner-Component (将订阅 Spinner-service 以相应地更改 active 的值)
import {Component} from '@angular/core';
import { SpinnerService} from 'path/to/spinner-service';
@Component({
selector: 'spinner-component',
'template': '<div *ngIf="active" class="spinner loading"></div>'
})
export class SpinnerComponent {
public active: boolean;
public constructor(spinner: SpinnerService) {
spinner.status.subscribe((status: boolean) => {
this.active = status;
});
}
}
Spinner-Service (引导此服务)
定义一个由 spinner-component 订阅的 observable,以更改更改时的状态,以及了解和设置 spinner 活动/非活动的功能。
import {Injectable} from '@angular/core';
import {Subject} from 'rxjs/Subject';
import 'rxjs/add/operator/share';
@Injectable()
export class SpinnerService {
public status: Subject<boolean> = new Subject();
private _active: boolean = false;
public get active(): boolean {
return this._active;
}
public set active(v: boolean) {
this._active = v;
this.status.next(v);
}
public start(): void {
this.active = true;
}
public stop(): void {
this.active = false;
}
}
所有其他路线的组成部分
(样本):
import { Component} from '@angular/core';
import { SpinnerService} from 'path/to/spinner-service';
@Component({
template: `<div *ngIf="!spinner.active" id="container">Nothing is Loading Now</div>`
})
export class SampleComponent {
constructor(public spinner: SpinnerService){}
ngOnInit(){
this.spinner.stop(); // or do it on some other event eg: when xmlhttp request completes loading data for the component
}
ngOnDestroy(){
this.spinner.start();
}
}
原文由 Ankit Singh 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答5.1k 阅读✓ 已解决
5 回答2k 阅读
2 回答1.9k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.4k 阅读
4 回答2.2k 阅读
3 回答2.1k 阅读
当前的 Angular 路由器提供导航事件。您可以订阅这些并相应地更改 UI。请记住计入其他事件,例如
NavigationCancel
和NavigationError
以在路由器转换失败时停止微调器。app.component.ts - 你的根组件
app.component.html - 你的根视图
性能改进答案:如果您关心性能,有更好的方法,实现起来稍微繁琐一些,但性能改进值得付出额外的努力。除了使用
*ngIf
有条件地显示微调器,我们可以利用 Angular 的NgZone
和Renderer
来打开/关闭 Angular 检测时会绕过检测更改微调器的状态。与使用*ngIf
或async
管道相比,我发现这可以使动画更流畅。这与我之前的回答类似,但有一些调整:
app.component.ts - 你的根组件
app.component.html - 你的根视图