我需要在整个angular2
项目中设置通用加载器。所以我只想做的是当我的新http
调用生成它是 GET、POST 或 PUT 时,然后在请求发送加载程序出现之前。一旦http
响应(成功或错误)从服务器端到达,则加载程序应该消失。
有任何可用的内置模块可以使用我可以执行上述功能。或者给我任何方式,以便我可以使用角度函数来完成。我正在使用rxjs
请求http
。
我不想使用 jQuery 或 Javascript。
我需要在整个angular2
项目中设置通用加载器。所以我只想做的是当我的新http
调用生成它是 GET、POST 或 PUT 时,然后在请求发送加载程序出现之前。一旦http
响应(成功或错误)从服务器端到达,则加载程序应该消失。
有任何可用的内置模块可以使用我可以执行上述功能。或者给我任何方式,以便我可以使用角度函数来完成。我正在使用rxjs
请求http
。
我不想使用 jQuery 或 Javascript。
扩展 HTTP 效果很好——在我们的项目中,我们还希望在某些场景中显式控制“加载器”,也就是微调器。所以我们的核心模块中有一个SpinnerService可供所有组件使用。
@Injectable()
export class SpinnerService {
private spinnerStateSource = new Subject<SpinnerState>();
spinnerState$ = this.spinnerStateSource.asObservable();
private defaultMessage: string = 'Loading...';
show(message?: string) {
let msg = this.defaultMessage as string;
if (message) {
msg = message;
}
this.spinnerStateSource.next({ showing: true, message: msg });
}
hide() {
this.spinnerStateSource.next({ showing: false, message: '' });
}
spin(obs: Observable<any>, message?: string): Observable<any> {
this.show(message);
return obs.finally(() => this.hide());
}
}
class SpinnerState {
showing: boolean;
message: string;
}
主模块中的组件订阅服务以显示/隐藏实际的微调器 UI(编辑:就像在@Gunter 的回答中一样),其他组件可以(通过服务)告诉微调器显示/隐藏。
我们使用的一个示例是,如果一个组件必须进行多次 HTTP 调用以获取一些参考数据,那么我们希望微调器显示直到所有这些调用完成。所以我们spin
用我们正在等待的动作调用函数
例如在消费组件中:
this.spinnerService.spin(
Observable.forkJoin(
this.refDataService.getRefDataList('statusTypes'),
this.refDataService.getRefDataList('itemTypes')
)
).subscribe(result => {
this.statusTypes = result[0];
this.itemTypes = result[1];
});
@Injectable()
class MyService {
private change:Subject<boolean> = new BehaviorSubject(false);
public change$ = this.change.asObservable();
constructor(private http:Http) {}
get(...) {
this.change.next(true)
return this.http.get( ... )
.map( ... )
.finally(_ => this.change.next(false);
}
}
@Component({
selector: 'loader',
template: `
<div *ngIf="myService.change | async">is loading ...</div>
`
)}
class LoaderComponent {
constructor(public myService:MyService){}
}