私はAngularを初めて使用するので、httpリクエストが行われるたびにspinner
を表示する必要があります。
私には多くのコンポーネントがあります:
<component-one></component-one>
<component-two></component-two>
<component-three></component-three>
<component-n></component-n>
それぞれにデータを取得または保存するhttpリクエストがあるため、httpリクエストが作成されたときに<loading></loading>
コンポーネントを表示したいので、httpリクエストを使用して他のコンポーネントにロードコンポーネントを注入することはお勧めできません。 http要求を持つ各コンポーネントに<loading>
コンポーネントを自動的にロードできるangularからフィルターまたは何かを追加できますか?
また、httpリクエストが完了したら、「Done」またはsometingなどのメッセージを表示します。
誰かが私にその解決策を提供できるなら、本当に感謝します、ty。
UPD: plunker を見てみましょう app.ts
。すべてを1つのファイルに収めてすみません。
Angular 4.3では、インターセプターをサポートする新しいHttpClientModuleがあります。主なアイデアは次のようなものにすることです:
@Injectable()
export class LoadingIndicatorService {
private _loading: boolean = false;
get loading(): boolean {
return this._loading;
}
onRequestStarted(): void {
this._loading = true;
}
onRequestFinished(): void {
this._loading = false;
}
}
そして、クリストファーの答えのロジックをHttpInterceptorに適用するだけです。
知っておくべきことは、同時リクエストのみです。これは、たとえば、各リクエストに一意の識別子を生成し、リクエストが完了するまでどこかに保存することで解決できます。
次に、LoadingIndicator
を注入するグローバルLoadingIndicatorService
コンポーネントを作成できます。
HttpClientModuleの詳細: https://medium.com/codingthesmartway-com-blog/angular-4-3-httpclient-accessing-rest-web-services-with-angular-2305b8fd654b
この2つのnpmパッケージを確認してください。
ngx-progressbar 、これはリクエストごとに待機インジケータを自動的に表示できます( 自動読み込みバーを参照してください )、 router events または必要なときに。 demo を参照してください。
ng-http-loader (Angular 4.3+のみ)、より伝統的な方法で同じ仕事をする SpinKit の派手なスピナーがあります。
Httpリクエストは、サブスクライブできるObservable
を返します。
たとえば、ユーザーの認証を取得しましょう。
私のサービスで:
login(email: string, password: string): Observable<User> {
let url = this.authUrl + '/login';
return this.http
.post(url, JSON.stringify({ email, password }))
.map(res => res.json());
}
コンポーネントでこのメソッドを呼び出してサブスクライブします。
this.isLoading = true;
this.authService.login(email, password)
.subscribe(data => {
this.isLoading = false;
// Do whatever you want once the user is logged in
// Where 'data' is the User returned by our http request
}, error => {
// Handle errors here
}
ユーザーのログインを試みる前にtrueに設定され、認証が成功するとfalseに設定されるブールisLoading
に注意してください。
これは、次のように、このブール値を使用してロードアニメーションを表示および非表示にできることを意味します。
<loading-component *ngIf="isLoading"></loading-component>
angular 2+、再利用可能なユーティリティコンポーネントを作成する
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'app-progress-mask',
templateUrl: './progress-mask.component.html',
styleUrls: ['./progress-mask.component.css']
})
export class ProgressMaskComponent implements OnInit {
@Input() showProgress:boolean = false;
constructor() { }
ngOnInit() {
}
}
Html部分:
<div class="loadWrapper" *ngIf="showProgress">
<div class="loader"></div>
</div>
cSSパーツ:
.loadWrapper {
background: rgba(0,0,0,0.3);
width: 100%;
height: 100%;
position: fixed;
top:0px;
left:0px;
z-index: 99999;
}
.loader {
border: 5px solid #f3f3f3; /* Light grey */
border-top: 5px solid #3d3e3f; /* gray */
position: absolute;
left: 50%;
top: 50%;
border-radius: 50%;
width: 50px;
height: 50px;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
これをコンポーネントに挿入します
<app-progress-mask [showProgress]="showMask"></app-progress-mask>
コンポーネントのshowMaskを再利用可能なutilコンポーネントにバインドします
あなたのcomponent.ts
public loading: boolean = false;
component.html内
<div *ngIf="!loading">
<component-one></component-one>
<component-two></component-two>
<component-three></component-three>
<component-n></component-n>
</div>
<loading *ngIf="loading"></loading>
読み込みアイコンを表示する必要があるときはいつでも、単にthis.loading = true;
と非表示にするthis.loading = false;
これにより、ロード中に表示したくないコンポーネントが非表示になり、代わりにロードアイコンが表示されます。