アプリケーションが起動する前に、いくつかのデータを読み込もうとしています。私がそれをする必要がある理由は、メニューのいくつかが、たとえばユーザーの場所に基づいて、いくつかのユーザー条件に基づいてアクセスを制限しているためです。
したがって、ユーザーがまだ場所を持っていない場合、またはその場所が特定のビューにアクセスするために有効になっていない場合は、それをブロックする必要があります。
Angular Resolveメソッドを使用しようとしましたが、成功しませんでした。これが私がしたことです。
ガードを解決
// The apiService is my own service to make http calls to the server.
@Injectable()
export class AppResolveGuard implements Resolve<any> {
constructor(
private _api: ApiService,
private _store: Store<IStoreInterface>,
) { }
resolve(): any {
return this._api.apiGet('loadData').subscribe(response => {
this._store.dispatch({
type: USER_FETCH_DATA,
payload: response.usuario
});
return response;
});
}
}
ルーティング
export const routing = [
{
path: '', component: AppComponent, canActivateChild: [AuthGuard], resolve: {app: AppResolveGuard},
children: [
{ path: 'home', component: HomeComponent },
{ path: 'company', canActivate: [LocationGuard], component: CompanyComponent },
]
}
];
AuthGuardは、有効なCookieセッションをチェックするだけです。
ご覧のとおり、アクセスをブロックしようとしているルーティングはcompany
ルーティングです。たとえば、最初のアクセスがページhome
へのアクセスで、次にページcompany
に移動した場合、最初に別のページを読み込んだときにアクセスを防ぐことができます。ユーザーデータと場所はすでに利用可能です。
ただし、最初のアクセスがcompany
ページへのアクセスである場合、LocationGuard
がユーザーの場所を検証しようとしたときにデータが利用できないため、すべてのユーザーがそこに移動するのをブロックします。まだ。
また、Resolve
をCanActivate
に置き換えようとしましたが、データが利用可能になった後はビューが有効にならず、空白のページにとどまります。
アプリケーションが起動する前に、APP_INITIALIZER
を使用してデータをロードできると思います。
この記事を確認してください:
この質問 の回避策を見つけました。
canActivate
を使用する方法を見つけました。私はすでに.map()
を使用してObservable
を返そうとしましたが、重要な点は最後の.first()
であり、これで問題は解決しました。
Resolve
を使用して同じ結果を達成する方法がある場合は、それがより良いかもしれないので、私はそれを開いたままにしておきます。