私はしませんので、ずっと前に同じ問題に対処しなければならなかったし、次の解決策を考え出しました。
組み込みのHttp
サービス用のラッパーサービスを作成しました。これはベストプラクティスかどうかわかりませんが、Angular 1のインターセプターがこれの解決策として本当に好きでした。 Http
を使用したい場合は、代わりにこのサービスを注入します。
@Injectable()
export class HttpWrapper {
constructor(private loginService:LoginService, private http:Http, private router:Router) {
}
get(url: string, options?: RequestOptionsArgs): Promise<Response> {
let promise: Promise<Response> = this.http.get(url, this.addHeaders(options)).toPromise();
return new Promise((resolve, reject) => {
promise.then(success => {
resolve(success);
}, error => {
this.onError(error);
reject(error);
});
});
}
//... repeat the same concept for post, put, delete...
private addHeaders(otherOptions?: RequestOptionsArgs): RequestOptions {
let headers = new Headers({'Content-Type': 'application/json', token: this.loginService.token});
let options = new RequestOptions({ headers: headers });
if (otherOptions) {
options.merge(otherOptions);
}
return options;
}
private onError(reason) {
if(reason.status === 401) {
this.router.navigateByUrl(`/login?${encodeURIComponent(this.router.lastNavigationAttempt)}`);
}
}
}
※廃止予定のルータを使用しています。私はAngularチームが新しいものを正しく文書化するのを待っています。
私はこれがあなたの質問1-3にかなり答えると思います。ボーナスに関する質問は、ユースケースの問題です。いずれにしてもユーザーのデータを使用することがわかっている場合は、ユーザーのデータを事前にロードすることが理にかなっています。それ以外の場合は、開始時にアプリケーションを正しくオーバーロードしないために、必要なときにのみこのデータをロードすることができます。