アプリをangularjsからangular2に移動しています。私はAngular Loading Bar
を使用していました。
angularインターセプターを使用した自動読み込みバー。自動的に機能するため、依存関係として含めるだけで、$ httpリクエストの進行状況が自動的に表示されます。
私はangular2で同様のプラグインを見つけようとしています。 ng2-slim-loading-bar
のようなものに出くわしましたが、ここでは進行状況を手動で管理する必要があります。 httpリクエストごとに、プログレスバーを手動で開始してから終了する必要があります。
それで、angularjsでAngular Loading Bar
が行うことを正確に実行できる既存のプラグインはありますか?または、既存のプラグインをこのように動作するように変更するにはどうすればよいですか。
ngx-progressbar を使用できます。 自動的に HTTPリクエストの実行中に進行状況バーを表示できます。
あなたがしなければならないのは:
1- NgProgressCustomBrowserXhr
をインポートして提供します
import { NgProgressCustomBrowserXhr } from 'ngx-progressbar';
@NgModule({
providers: [
// ...
{ provide: BrowserXhr, useClass: NgProgressCustomBrowserXhr } ,
],
imports: [
// ...
NgProgressModule
]
})
2-テンプレートで以下のように使用します。
<ng-progress></ng-progress>
進行状況が開始され、HTTPリクエストで自動的に完了します。 NgProgressServiceを使用してstart()/ done()を手動で呼び出す必要はありません。
これが私たちのプロジェクト(Red Hat Automated Migration Toolkit)で行ったことです:
LoadingIndicatorService
によってキャッチされます。LoadingIndicatorService
SlimLoaderBarService
をラップし、complete()
が呼び出されます。ナビゲーションステップごとに複数のリクエストがある場合、これは非常に自然に見え、優れたUXを提供します。通常、リクエストが1つしかない場合は、CSSベースのアニメーションを調整する(長くする)か、結局start()
を使用することをお勧めします。
ここにいくつかの重要なコード部分があります:
@Injectable()
export class LoadingIndicatorService {
constructor(
private _slimBarService: SlimLoadingBarService,
private _eventBusService: EventBusService,
) {
// Register the LoadingSomething event listeners.
this._eventBusService.onEvent
.filter(event => event.isTypeOf(LoadingSomethingStartedEvent))
.subscribe((event: LoadingSomethingStartedEvent) => this.loadingStarted() )
this._eventBusService.onEvent
.filter(event => event.isTypeOf(LoadingSomethingFinishedEvent))
.subscribe((event: LoadingSomethingFinishedEvent) => this.loadingFinished() )
}
public getSlimService(){
return this._slimBarService;
}
private counter: number = 0;
private max: number = void 0;
private reset() {
this.counter = 0;
this.max = void 0;
}
public loadingStarted(){
this.counter++;
this.max = this.counter;
this.updateProgress();
}
public loadingFinished(){
this.counter--;
this.updateProgress();
}
private updateProgress() {
if (this.counter == 0) {
this._slimBarService.height = "2px";
this._slimBarService.visible = true;
this._slimBarService.progress = 95;
this.max = void 0;
Observable.timer(700).subscribe(() => {
this._slimBarService.complete();
});
}
else {
// max - counter = finished.
// If the things to load are added after something loaded, the progress would go back.
// But let's rely on that loading will start fast at the beginning.
// Start at 20, jump to 90.
let percent = 20 + 70 * (1 - (this.max - this.counter) / this.max);
this._slimBarService.height = "3px";
this._slimBarService.color = "#39a5dc";
this._slimBarService.visible = true;
this._slimBarService.progress = percent;
}
}
}
let responseObservable2 = responseObservable.do(
() => console.log("Request SUCCEEDED"),
() => console.log("Request FAILED"),
() => {
console.log("Request FINISHED");
if (this._eventBus) {
console.log("Request FINISHED, firing");
this._eventBus.fireEvent(new LoadingSomethingFinishedEvent(responseObservable))
}
}
);
HTTPサービスラッパー:
@Injectable()
export class WindupHttpService extends Http {
private configureRequest(method: RequestMethod, f: Function, url: string | Request, options: RequestOptionsArgs = {}, body?: any): Observable<Response> {
let responseObservable: Observable<Response> = ...
...
console.log("Load STARTED");
if (this._eventBus)
console.log("Load STARTED, firing");
this._eventBus.fireEvent(new LoadingSomethingStartedEvent(responseObservable));
return responseObservable2;
}
完全なコードについては、github.comでプロジェクトWindupを検索してください。
小切手 @ngx-loading-bar
これはHttpコールとルーティングのプログレスバーを自動的に追加します