私はAngularの初心者です。2.アプリのすべての部分に独立したモジュールを作成したい。たとえば、デフォルトコンポーネント-子コンポーネント(SignInまたはSignUp)のルーターアウトレットを含むAuthComponentでAuthModuleを作成しました。そこで、次のシナリオを実現したいと思います。
しかし、localhost /にアクセスすると、/ authへのリダイレクトが必要なものになりますが、サインインへの次のリダイレクトは表示されません。
私のコード:app.routing
const routes: Routes = [
{path: '', redirectTo: '/auth', pathMatch: 'full'}
];
export const appRouting: ModuleWithProviders = RouterModule.forRoot(routes);
auth.routing
const routes: Routes = [
{
path: 'auth',
component: AuthComponent,
children: [
{path: '', redirectTo: 'sign-in', pathMatch: 'full'},
{path: 'sign-in', component: SignInComponent}
]
},
];
export const authRouting: ModuleWithProviders = RouterModule.forChild(routes);
auth.component.html
<div class="container">
<h1>Auth component</h1>
<router-outlet></router-outlet>
</div>
結果:
環境@ angular/cli:1.0.0-rc.2ノード:7.7.1 os:win32 x64
私も同じ問題を抱えています。 Angularトリックのようです: 'redirectTo'フィールドの先頭のスラッシュを削除すると、アプリケーションは認証/サインインにリダイレクトされます。
App.routingでこれを使用します。
const routes: Routes = [
{path: '', redirectTo: 'auth', pathMatch: 'full'},
];
「redirectTo」値は「/」で始まる=絶対パス
「redirectTo」の値は「/」なしで始まります=相対パス
それについてもっと読む: https://vsavkin.com/angular-router-understanding-redirects-2826177761fc
P.Sあなたの構造はYounesMの構造よりも正確であるとの私の意見。親モジュールは子ルートを保持できません。「app」モジュールは、「auth」モジュールに子モジュール「sign-in」があることを知りません。
そのため、redirectTo:'auth'
が''
の子コンポーネントをロードしようとしますが、コンポーネントがないため、ルーターアウトレットは空です。
{path: '', redirectTo: 'sign-in', pathMatch: 'full'}
には他の目的がないため、sign-in
にリダイレクトするように見えるので、代わりに/auth/sign-in
にリダイレクトできます。
app.routes
const routes: Routes = [
{path: '', redirectTo: '/auth/sign-in', pathMatch: 'full'}
];
export const appRouting: ModuleWithProviders = RouterModule.forRoot(routes);
auth.routes
const routes: Routes = [
{
path: 'auth',
component: AuthComponent,
children: [
{path: 'sign-in', component: SignInComponent}
]
},
];
または、リダイレクトの代わりに''
パスにコンポーネントがあります。
app.routes
const routes: Routes = [
{path: '', redirectTo: '/auth', pathMatch: 'full'}
];
export const appRouting: ModuleWithProviders = RouterModule.forRoot(routes);
auth.routes
const routes: Routes = [
{
path: 'auth',
component: AuthComponent,
children: [
{path: '', component: SignInComponent}
]
},
];
とても簡単です:
const routes: Routes = [
{ path: '', redirectTo: '/auth/signin', pathMatch: 'full' },
{ path: 'auth', component: AuthComponent,
children: [
{ path: 'signup', component: SignupComponent },
{ path: 'signin', component: SigninComponent },
{ path: 'logout', component: LogoutComponent }
]
},
{ path: '**', redirectTo: '/auth/signin', pathMatch: 'full' }
];
auth.routesで
const routes: Routes = [
{
path: 'auth',
redirectTo: 'auth/sign-in'
},
{
path: 'auth',
component: AuthComponent,
children: [
{path: 'sign-in', component: SignInComponent}
]
},
];
次のように、外部モジュールでリダイレクトを使用できます。
// Root routing module or app.routing.module
const routes: Routes = [
{path: '', redirectTo: '/auth', pathMatch: 'full'},
{path: 'auth', redirectTo: '/auth/sign-in', pathMatch: 'full'}
];
// Child routing module or child.routing.module
const routes: Routes = [
{
path: 'auth',
//component: AuthComponent, may not need this as you only need the template
children: [
{path: 'sign-in', component: SignInComponent}
]
},
];
適切なパスでこれにナビゲートしたい場合、子コンポーネントに空のパス ''を持つ必要はありません
私も同じ問題を抱えていますが、上記の答えはどれも良い解決策ではないようです。私のコードでは、ルーターイベントをサブスクライブし、最終的に解決します。
authComponentのコンストラクターのコード:
this.router.events.subscribe((e: Event) => {
if (e instanceof NavigationEnd) {
this.activeUrl = e.urlAfterRedirects || e.url;
if (this.activeUrl === '/auth') {
this.router.navigateByUrl('/auth/sign-in');
}
}
});
子ルートでこれを行うことができます。
const routes: Routes = [
{ path: 'auth', redirectTo: 'auth/signin'},
{
path: 'auth',
component: AuthComponent,
children: [{ path: 'signin', component: SignInComponent }],
},
];