Angular 2: enrutamiento de submódulo y <router-outlet> anidado

82

Estoy buscando una solución con Angular 2 para el escenario que se explica a continuación:

ingrese la descripción de la imagen aquí

En este escenario, la navegación superior contiene enlaces para cargar submódulos y la navegación secundaria tiene enlaces para actualizar el contenido del submódulo.

Las URL deben mapear como:

  • / home => carga la página de inicio en la salida del enrutador del componente principal
  • / submodule => carga el submódulo en la salida del enrutador del componente principal y por defecto debería mostrar la página de inicio del submódulo y la barra de navegación secundaria
  • / submodule / feature => carga la función dentro de la salida del enrutador del submódulo

El módulo de la aplicación (y el componente de la aplicación) contiene una barra de navegación superior para navegar a diferentes submódulos y la plantilla del componente de la aplicación podría verse así

<top-navbar></top-navbar>
<router-outlet></router-outlet>

Pero aquí está la complejidad. Necesito que mis submódulos tengan un diseño similar con una barra de navegación de segundo nivel y su propia salida de enrutador para cargar sus propios componentes.

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

Probé todas las opciones y busqué en todas partes, pero no pude encontrar una solución para tener una plantilla predeterminada (como el componente de la aplicación) en el submódulo con la salida del enrutador y también cargar el contenido del submódulo en la salida del enrutador interno sin perder el sub-nav .

Agradecería cualquier aportación o idea.

Ron F
fuente
Entonces, ¿qué está sucediendo exactamente con la configuración actual?
micronyks
1
con la configuración actual no puedo usar la salida del enrutador interno. El enrutamiento carga incluso los componentes del submódulo en la salida del enrutador principal y todas las plantillas de componentes de mi submódulo deben tener una navegación secundaria incluida
Ron F
1
¿Encontraste una solución para enrutador-salida anidado sin perder la navegación secundaria? Me he encontrado con un problema similar.
Saurav
2
Sí, creo que me encontré con lo mismo, la <sub-navbar> simplemente no se muestra, solo lo que sale de la salida del enrutador.
louisvno
Consulte aquí el ejemplo de RouterOutlet
Code Spy

Respuestas:

54

La página html se verá así.

Pagina principal

<top-navbar></top-navbar>
<router-outlet></router-outlet>

Página del submódulo

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

al hacer clic en navegación en la barra de navegación superior, la salida de la ruta principal se enrutará respectivamente.

al hacer clic en la barra de navegación secundaria, la salida del enrutador [sub] se enrutará respectivamente.

HTML está bien, el truco vendrá al escribir la aplicación.

app.routing.ts

const appRoutes: Routes = [
  {
    path: 'login',
    component: LoginComponent
  },
  { path: 'home',
    component: homeComponent,
    children: [
      {
        path: 'module1',
        component: module1Component,
        children: [
          {
            path: 'submodule11',
            component: submodule11Component,
          },
          {
            path: '',
            redirectTo: 'submodule11',
            pathMatch: 'full'
          }
        ]
      },
      {
        path: 'module2',
        component: module2omponent,
        children: [
          {
            path: 'submodule21',
            component: submodule21Component,
          },
          {
            path: '',
            redirectTo: 'submodule21',
            pathMatch: 'full'
          }
        ]
      }
    ]
  },
  {
    path: 'about',
    component: aboutComponent
  }
]

Espero que te ayude.

Más detalles https://angular.io/guide/router

Aswin KV
fuente
1
Sí, tu html str era correcto. El juego principal es con app.routing.ts. Había hecho aplicaciones similares dos veces.
Aswin KV
1
Gracias por la respuesta. Probé el enrutamiento similar pero mi confusión es ¿dónde debería ir la salida del enrutador de submódulo? en el módulo principal, está claro que la salida del enrutador debe estar en la plantilla del componente de la aplicación, pero no tenemos el mismo concepto de componente de la aplicación para los submódulos. Entonces, ¿a dónde va la salida del enrutador "sub"?
Ron F
Además, ¿cómo debería verse el routerLink en la barra de navegación secundaria?
Ron F
3
El enlace del enrutador debe ser una cadena si agrega '/' al principio de la cadena, reemplazará la ruta actual si no agrega '/', el enlace de la ruta se agregará con la ruta actual. Aún no lo tiene claro, cree una aplicación de muestra en alguna plataforma de codificación en línea y comparta el enlace
Aswin KV
2
No estoy completamente seguro de esto, pero la router-outletdirectiva anidada no necesita ser nombrada. Aquí hay un ejemplo: github.com/gothinkster/angular-realworld-example-app/blob/…
Jess
21

Utilizar:

RouterModule.forChild()
...
<router-outlet name="sub"></router-outlet>
...
[routerLink]="[{ outlets: { sub: [subRouteName] } }]"

Ejemplo completo:

HTML

<div class="tabs tinyscroll">
  <button *ngFor="let tab of tabs"
  [routerLink]="[{ outlets: { sub: [tab.name] } }]"
  routerLinkActive="selected">
    <span>{{ tab.label }}</span>
  </button>
</div>

<section>
  <router-outlet name="sub"></router-outlet>
</section>

app.module.ts

imports: [
...
    RouterModule.forChild([
      {
        path: 'registers',
        component: RegistersComponent,
        children: [
          {path: 'vehicles', component: VehiclesComponent, outlet: 'sub'},
          {path: 'drivers', component: DriversComponent, outlet: 'sub'},
          {path: 'bases', component: BasesComponent, outlet: 'sub'},
          {path: 'lines', component: LinesComponent, outlet: 'sub'},
          {path: 'users', component: UsersComponent, outlet: 'sub'},
          {path: 'config', component: ConfigComponent, outlet: 'sub'},
          {path: 'companies', component: CompaniesComponent, outlet: 'sub'}
        ],
        canActivate: [AuthGuard]
      }
    ]),
...
thxmxx
fuente
1
A partir de qué versión se admite esta ruta de nombre. Porque lo estoy intentando en v6 y no funciona.
Sujay UN
1
Esto no funciona en la versión actual de angular.
After_Sunset
0

tienes que mencionar el nombre de la salida en las rutas menciona el nombre de la salida de tu enrutador en la ruta como esta "salida: 'sub"

routes: Routes = [
  {path:'', redirectTo: 'login', pathMatch: 'full'},
  {
    path: 'login',
    component: LoginComponent,

  },
  { path: 'home',
    component: AppComponent,
      children: [
        {path: 'home/pdf',component: SideMenuPage,outlet:"sub" },
        {path:'home/addFileUp',component:SidePageAdd,outlet:"sub"},
      ]
   },
];
Nambi N Rajan
fuente
este fragmento devuelve un error: "Error de referencia no detectado: el componente de inicio de sesión no está definido"
Umpa