Búsqueda de sitios web

javascript - El enrutador de Angular no muestra mi componente


Tengo una aplicación simple de Angular 2 con un módulo (módulo InformationPagesModule) que contiene dos componentes de carga diferida (Componente Info1 y Componente Info2). Quiero cargar esos componentes al ingresar a las siguientes rutas en el navegador:

http://localhost:4200/info1 - Carga el Componente Info1

http://localhost:4200/info2 - Carga el Componente Info2

aquí las clases de interés:

app.component.html

<router-outlet></router-outlet>

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { InformationPagesModule } from './information-pages/information-pages.module';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    SharedModule,
    InformationPagesModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule, Router } from '@angular/router';
import { HomeComponent } from './home/home.component';

const routes: Routes = [
  {path:'', component: HomeComponent},
  {path:'info1', loadChildren: './information-pages/information-pages.module#InformationPagesModule'},
  {pathMatch:'full', path:'info2', loadChildren: './information-pages/information-pages.module#InformationPagesModule'},
  { path: '**', redirectTo: '' }
];
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],

})
export class AppRoutingModule { }

information-pages.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { InformationPagesRoutingModule } from './information-pages-routing.module';
import { Info1Component } from './info1/info1.component';
import { Info2Component } from './info2/info2.component';

@NgModule({
  imports: [
    CommonModule,
    InformationPagesRoutingModule
  ],
  declarations: [Info1Component, Info2Component]
})
export class InformationPagesModule { }

information-pages-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { Info1Component } from './info1/info1.component';
import { Info2Component } from './info2/info2.component';

const routes: Routes = [
  {path:'info1', component: Info1Component},
  {path:'info2', component: Info2Component}
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class InformationPagesRoutingModule { }

Mi pregunta es, ¿por qué al ingresar a algunas de las rutas /info1 o /info2, se muestra una página en blanco?

¿Cómo debería configurar las rutas en mi aplicación para que funcione?

¡Muchas gracias!

Respuesta #1

En tu app-routing.module.ts quieres declarar una ruta principal para todas las rutas de un módulo cargado de forma perezosa (lazy). Eso significa que podrías querer mapear todas las rutas que comienzan con /info a tu information-pages-routing.module.ts. Las rutas a tus componentes (info1 e info2) las declararás dentro del módulo cargado de forma perezosa.

app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule, Router } from '@angular/router';
import { HomeComponent } from './home/home.component';

const routes: Routes = [
  { path:'', component: HomeComponent },
  { path: 'info', loadChildren: './information-pages/information-pages.module#InformationPagesModule' },
  { path: '**', redirectTo: '' }
];
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],

})
export class AppRoutingModule { }

El archivo information-pages-routing.module.ts permanece igual

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { Info1Component } from './info1/info1.component';
import { Info2Component } from './info2/info2.component';

const routes: Routes = [
  {path:'info1', component: Info1Component},
  {path:'info2', component: Info2Component}
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class InformationPagesRoutingModule { }

Ahora podrás acceder al Info1Component mediante la ruta /info/info1 y al Info2Component mediante la ruta /info/info2. Si deseas acceder a tus componentes mediante las rutas /info1 y /info2, puedes crear dos módulos cargados de forma diferida o simplemente redirigir /info1 a /info/info1

También podrías considerar cargar módulos secundarios así:

{ path: 'info', loadChildren: () => import('./information-pages/information-pages.module').then(m => m.InformationPageModule) }

En lugar de

{ path: 'info', loadChildren: './information-pages/information-pages.module#InformationPagesModule' }

Para más información, por favor consulte la documentación oficial https://angular.io/guide/lazy-loading-ngmodules

Respuesta #2

Usa esta manera en lugar de usar el enrutamiento a nivel de módulo, usa AppRoutingModule para enrutar tus componentes.

import { NgModule } from '@angular/core';
import { Routes, RouterModule, Router } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { Info1Component } from './info1/info1.component';
import { Info2Component } from './info2/info2.component';

const routes: Routes = [
  {path:'', component: HomeComponent},
  {path:'info1', component: Info1Component},
  {path:'info2', component: Info2Component},
  { path: '**', redirectTo: '' }
];
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],

})
export class AppRoutingModule { }

Si utilizas esta información, pages-routing.module.ts ya no es necesario.