Reputation: 1178
I am a newbie in Angular 2. I want to create isolated modules for every part of my app. For example I created the AuthModule
with default component - AuthComponent
which contain a router-outlet
for his child components (SignIn or SignUp). So I want to realise the following scenario:
But when I going to localhost/ I get redirect to /auth what I want, but the next redirect to sign-in doesn't appear.
My code:
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>
Result:
Environment @angular/cli: 1.0.0-rc.2 node: 7.7.1 os: win32 x64
Upvotes: 61
Views: 100575
Reputation: 1075
I have been the same problem. It seems an Angular tricks: If you remove leading slash in 'redirectTo' field, your application will be redirected successfully to auth/sign-in.
Use this in app.routing:
const routes: Routes = [
{path: '', redirectTo: 'auth', pathMatch: 'full'},
];
‘redirectTo’ value starts with a ‘/’ = absolute path
‘redirectTo’ value starts without a ‘/’ = relative path
Read more about it: https://vsavkin.com/angular-router-understanding-redirects-2826177761fc
P.S My opinion that your structure more correctly then YounesM's one. Parent module can't keep children routes: "app" module don't know that "auth" module have children module "sign-in".
Upvotes: 54
Reputation: 936
On auth.routes
const routes: Routes = [
{
path: "auth",
redirectTo: "auth/sign-in"
},
{
path: "auth",
component: AuthComponent,
children: [{ path: "sign-in", component: SignInComponent }]
}
];
Upvotes: 44
Reputation: 141
I have been the same problem, but none of the above answers seems to be a good resolution. In my code , i subscribe to the router events and finally resolve it.
code in AuthComponent's constructor:
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');
}
}
});
Upvotes: 0
Reputation: 2317
So, what it seems to happen is that when you redirectTo:'auth'
it tries to load the ''
children's component and since it does not have any component the router-outlet is empty.
Now it seems like {path: '', redirectTo: 'sign-in', pathMatch: 'full'}
doesn't have any other purpose then redirecting to sign-in
so you can simply redirect to /auth/sign-in
instead.
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}
]
},
];
or have a component in your ''
path instead of redirecting.
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}
]
},
];
Upvotes: 10
Reputation: 23
You can do this in your child route:
const routes: Routes = [
{ path: 'auth', redirectTo: 'auth/signin'},
{
path: 'auth',
component: AuthComponent,
children: [{ path: 'signin', component: SignInComponent }],
},
];
Upvotes: 2
Reputation: 700
You can use the re-direction in your outer module, like this:
// 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}
]
},
];
You need not to have an empty path '' in your child component in case you want to navigate to this with a proper path
Upvotes: 1
Reputation:
It's quite simple:
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' }
];
Upvotes: 3