Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular routing with multiple routes and router-outlet

I'm trying to add navigation to components in addition to the navigation of the app root, but it is not navigating to component route.

I'm using two router-outlet:

  • router outlet for the app root (app.component.html)
  • router outlet for users component (users.component.html)

With two routes:

  • route for the app (app.routing.module.ts)
  • route for users (users.routing.module.ts)

When navigating to "users" I can see users.component.html with two links, but when pressing on the link "list", it is not navigating to: UsersListComponent defined in users.routing.module.ts

I'm not sure if this is the correct way to do this.

Below is folder structure of the project and source code:

-- app.routing.module.ts
-- app.component.html
-- components
   -- dashboard
   -- users
      -- users.component.html
      -- users.module.ts
      -- users.routing.module.ts

app.routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { UsersModule } from './panels/users/users.module';

const AppRouting: Routes = [
    { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
    { path: 'dashboard', component: DashboardComponent },
    { path: 'users', loadChildren: () => UsersModule  }
    { path: '**', component: DashboardComponent }
];

@NgModule({
    imports: [RouterModule.forRoot(AppRouting, { enableTracing: true })],
    exports: [RouterModule],
    providers: []
})
export class AppRoutingModule { }

app.component.html

<div class="app-wrapper">
    <router-outlet></router-outlet>
</div>

users.component.html

<a [routerLinkActive]="['active']" [routerLink]="[{ outlets: { 'users':['list'] } }]" [skipLocationChange]="true">List</a>&nbsp;
<a [routerLinkActive]="['active']" [routerLink]="['create']" [skipLocationChange]="true">Create</a>&nbsp;
<router-outlet name="users"></router-outlet>

users.routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule, RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';
import { CreateUserComponent } from './user-create/user-create.component';
import { UsersListComponent } from './users-list/users-list.component';
import { UsersComponent } from './users.component';

const UsersRouting: Routes = [
     { path: 'list', component: UsersListComponent, outlet: 'users' },
     { path: 'create', component: CreateUserComponent, outlet: 'users' },
     { path: 'edit', component: CreateUserComponent, outlet: 'users' },
     { path: '', component: UsersComponent }
];

@NgModule({
  imports: [
      RouterModule.forChild(UsersRouting)
  ],
  declarations: [],
  exports: [
      RouterModule
  ],
})
export class UsersRoutingModule {}

users.module.ts

import { NgModule } from '@angular/core';
import { CreateUserComponent } from './user-create/user-create.component';
import { UsersComponent } from './users.component';
import { UsersListComponent } from './users-list/users-list.component';
import { UsersRoutingModule } from './users.routing.module';

@NgModule({
  imports: [
    UsersRoutingModule,
  ],
  declarations: [
    UsersComponent,
    UsersListComponent,
    CreateUserComponent
  ]
})
export class UsersModule { }

Thanks in advance

like image 681
Israel Avatar asked Aug 10 '18 21:08

Israel


People also ask

Can we have multiple router outlet in Angular?

Angular Router supports multiple outlets in the same application. A component has one associated primary route and can have auxiliary routes. Auxiliary routes enable developers to navigate multiple routes at the same time.

Can we define multiple router outlets in a component view?

Yes! We can use multiple router-outlets in same template by configuring our routers and simply add the router-outlet name. You can see in the example.

What is outlet in Angular routing?

Router-Outlet is an Angular directive from the router library that is used to insert the component matched by routes to be displayed on the screen.

What is router Outlet Is it possible to use more than router outlet?

Router outlet is a dynamic component that the router uses to display in this case either the Home or the AllLessons components. There is nothing special about these components, these could be any component.


2 Answers

Do you really need a named router outlet?

<router-outlet name="users"></router-outlet>

Or could you just use a child router outlet:

<router-outlet></router-outlet>

I have a video about routing here that may help: https://www.youtube.com/watch?v=LaIAHOSKHCQ&t=1s

like image 194
DeborahK Avatar answered Oct 20 '22 19:10

DeborahK


Yo... just specify the outlet to be a custom outlet https://angular.io/guide/router#add-a-secondary-route

so you could say

{
  path: 'compose',
  component: ComposeMessageComponent,
  outlet: 'popup'
},

Then this component will render in a <popup></popup> component

like image 25
Joey Gough Avatar answered Oct 20 '22 18:10

Joey Gough