2016-05-29 11 views
2

私はアプリケーションワイドのローディングバーを実装しようとしています。ユーザーがアプリケーションのリンクをクリックしてデータをダウンロードしている最中にローディングバーが表示されるようにします。このようなAngular2 RC1ローディングインジケータを実装するための最善のアプローチ

何か:現在

http://chieffancypants.github.io/angular-loading-bar/

、私がやったことはブール型プロパティ、isLoadingグローバルシングルトンサービスを追加されます。私の主なアプリコンポーネントのテンプレートでは、角度material2プログレスバーを追加しました。

<md-progress-bar mode="indeterminate" *ngIf="_globalService.isLoading"></md-progress-bar> 

ここで、httpリクエストを開始するたびに、そのコンポーネントのisLoadingプロパティをtrueに設定します。その要求が完了すると、私はそれをfalseに設定します。

私の現在のケースでは、すべてのコンポーネントにサービスを注入し、手動でisLoadingをtrueまたはfalseに設定する必要があります。

私は、アプリケーション全体ですべてのAjaxリクエストの開始と完了をキャプチャする方法があるのだろうかと疑問に思っていたので、これを購読して手動で処理する必要はありません。

答えて

2

私は、あなたが何をしているのかを2通りの方法で確認できます。最初のものはすべてのHttpリクエストを専用サービスに抽象化し、2つ目はHttpサービスをラップすることです。

サービス。とにかくコンポーネントからHttpリクエストを作成することはおそらく最良のアイデアではないでしょう。したがって、http-stuffを専用サービスに移動してそこから_globalService.isLoadingフラグを設定する方が良いでしょう。コンポーネントはこれらのことを知ってはいけません。「getAccounts」などのことだけを気にします。実際のHTTPリクエストを抽象化すると、インジケータフラグがコンポーネントコードから隠される可能性があります。

デフォルトのHttpサービスをラップします。 isLoadingフラグを設定できるもう1つの層にHttpサービスをラップすることは完全に可能です。この場合、コンポーネントコードはインジケータ機械のローディングについては何も知らないでしょう。

import {Http} from '@angular/http'; 
import {Injectable} from '@angular/core'; 
import {GlobalService} from './globalService'; 

export class HttpLoading extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _globalService: GlobalService) { 
    super(backend, defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs) { 
    this._globalService.isLoading = true; 
    return super.get(url, options) 
     .map(res => { 
     this._globalService.isLoading = false; 
     return res; 
     }); 
    } 
} 

bootstrap(App, [ 
    GlobalService, 
    HTTP_PROVIDERS, 
    provide(Http, { 
    useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, globalService: GlobalService) => new HttpLoading(backend, defaultOptions, globalService), 
    deps: [XHRBackend, RequestOptions, GlobalService] 
    }) 
]) 

デモとして登録:http://plnkr.co/edit/S5nSpscC3tIwX63lrBtO?p=preview

+0

しかし、私は受け付けており、あなたの返信のためにそんなにdfsqありがとう

可能なラッパーは、このような何かを見ることができます私は2番目のアプローチを試してみるとエラーが発生します。 エラー\t TS2322 \tタイプ 'Observable 'は、タイプ 'Promise 'に割り当てられません。 'then'プロパティが 'Observable 'の型にありません。 –

+0

エラー\t TS2415 \t 'HttpLoading'クラスは、基本クラス 'Http'を正しく拡張しません。 プロパティ 'get'の型は互換性がありません。 '(url:string、options?:RequestOptionsArgs)=> Promise 'は '(URL:文字列、オプション?:RequestOptionsArgs)=> Observable 'のタイプに割り当てられません。 タイプ 'Promise 'はタイプ 'Observable 'に割り当てられません。 プロパティ '_isScalar'が 'Promise 'タイプにありません。 –

+0

'get(url:string、options ?: RequestOptionsArgs):Observable {...}'で、 'rxjs 'から' import {Observable}'を追加する必要があります。 – dfsq

関連する問題