Recientemente, comencé a jugar con angular 2. Hasta ahora es increíble. Entonces, comencé un proyecto personal de demostración para aprender a usar angular-cli
.
Con la configuración de enrutamiento básica, ahora quiero navegar a algunas rutas desde el encabezado, pero dado que mi encabezado es un padre para el router-outlet
, recibo este error.
app.component.html
<app-header></app-header> // Trying to navigate from this component
<router-outlet></router-outlet>
<app-footer></app-footer>
header.component.html
<a [routerLink]="['/signin']">Sign in</a>
Ahora entiendo parcialmente, supongo que dado que ese componente es un envoltorio router-outlet
, no sería posible acceder de esta manera router
. Entonces, ¿existe la posibilidad de acceder a la navegación desde el exterior para un escenario como este?
Me encantaría agregar más información si fuera necesario. Gracias de antemano.
Actualizar
1- Mi package.json
ya tiene la @angular/router 3.3.1
versión estable . 2- En mi app
módulo principal , he importado el routing-module
. Por favor ver más abajo.
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AlertModule } from 'ng2-bootstrap';
import { LayoutModule } from './layout/layout.module';
import { UsersModule } from './users/users.module';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';
@NgModule({
declarations: [
AppComponent,
PageNotFoundComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
AlertModule.forRoot(),
LayoutModule,
UsersModule,
AppRoutingModule --> This is the routing module.
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SigninComponent } from './users/signin/signin.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';
const routes: Routes = [
{ path: '**', component: PageNotFoundComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
La ruta a la que intento acceder está delegada de otra module
que es laUsersModule
user-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SigninComponent } from './signin/signin.component';
const usersRoutes: Routes = [
{ path: 'signin', component: SigninComponent }
];
@NgModule({
imports: [
RouterModule.forChild(usersRoutes)
],
exports: [
RouterModule
]
})
export class UsersRoutingModule { }
Mientras intento navegar desde un componente que es parte del Layout
módulo, pero no tengo noción del módulo enrutador. Es eso lo que está causando el error.
Layout.module.ts
import { NgModule } from '@angular/core';
import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
@NgModule({
declarations: [HeaderComponent, FooterComponent],
exports: [HeaderComponent, FooterComponent]
})
export class LayoutModule{}
Estoy tratando de navegar desde el HeaderComponent
. Estaré encantado de proporcionar más información si es necesario.
fuente
RouterModule
toimports: []
de todos los módulos donde usarouterLink
o?<router-outlet>
AppRoutingModule
antesLayoutModule
Respuestas:
Debe agregar
RouterModule
aimports
cada@NgModule()
componente donde los componentes usan cualquier componente o directiva (en este casorouterLink
y<router-outlet>
.declarations: []
es hacer componentes, directivas, tuberías, conocidos dentro del módulo actual.exports: []
consiste en poner componentes, directivas, tuberías disponibles para importar módulos. Lo que se agregadeclarations
solo es privado al módulo.exports
los hace públicosVer también https://angular.io/api/router/RouterModule#usage-notes
fuente
forRoot
solo una vez, los módulos secundarios solo deberían importar RouterModule sin llamar al método forRootforRoot
haga. Al registrar proveedores conforRoot
múltiples veces, el resultado es el mismo que si se hiciera solo una vez. Si haces otras cosas, esto podría no ser diferente.Le falta la inclusión del paquete de ruta o la inclusión del módulo de enrutador en su módulo de aplicación principal.
Asegúrese de que su package.json tenga esto:
Luego, en su app.module, importe el enrutador y configure las rutas:
Actualización :
Mueva el AppRoutingModule para ser el primero en las importaciones:
fuente
Agregaré otro caso en el que recibí el mismo error pero solo siendo un tonto. Había agregado
[routerLinkActiveOptions]="{exact: true}"
sin agregar aúnrouterLinkActive="active"
.Mi código incorrecto fue
cuando debería haber sido
Sin tener
routerLinkActive
, no puedes tenerrouterLinkActiveOptions
.fuente
Cuando nada más funcione cuando debería funcionar, reinicie ng serve. Es triste encontrar este tipo de errores.
fuente
En mi caso, solo necesito importar mi componente recién creado a RouterModule
Luego, en su
app.module
importación, el enrutador y configure las rutas:importar {RouterModule} desde '@ angular / router';
Espero que esto ayude a alguien !!!
fuente
Es necesario añadir
RouterMoudle
enimports
las secciones del módulo que contiene elHeader
componentefuente