No se puede vincular a 'routerLink' ya que no es una propiedad conocida

145

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.jsonya tiene la @angular/router 3.3.1versión estable . 2- En mi appmó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 moduleque 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 Layoutmó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.

Umair Sarfraz
fuente
Importe RouteModule en la raíz de su aplicación y actualice la última versión estable del paquete
npm
Sí, tengo la última versión estable.
Umair Sarfraz
2
¿También agregó el RouterModuleto imports: []de todos los módulos donde usa routerLinko?<router-outlet>
Günter Zöchbauer
El pedido del módulo @Umair es importante en las importaciones, muévase AppRoutingModuleantesLayoutModule
harshes53
1
@ harshes53 No creo que sea cierto.
Günter Zöchbauer

Respuestas:

259

Debe agregar RouterModulea importscada @NgModule()componente donde los componentes usan cualquier componente o directiva (en este caso routerLinky <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 agrega declarationssolo es privado al módulo. exportslos hace públicos

Ver también https://angular.io/api/router/RouterModule#usage-notes

Günter Zöchbauer
fuente
@Gunter, ¿está bien importar RouterModule varias veces? Por ejemplo, si quiero usar routerLink en un childModule, necesito importar RouterModule en el módulo hijo mientras que ya lo ha importado la aplicación raíz Módulo ...
Olivier Boissé
Sí, solo se incluirá una vez en la salida de compilación.
Günter Zöchbauer
Ok, pero creo que debemos tener cuidado de llamar al método forRootsolo una vez, los módulos secundarios solo deberían importar RouterModule sin llamar al método forRoot
Olivier Boissé
Creo que depende de lo que forRoothaga. Al registrar proveedores con forRootmúltiples veces, el resultado es el mismo que si se hiciera solo una vez. Si haces otras cosas, esto podría no ser diferente.
Günter Zöchbauer
2
Gracias por esta respuesta! En mi caso, la aplicación funcionó, pero las pruebas fallaron. La solución fue importar RouterTestingModule en pruebas, para cada componente que usa routerLink.
Slavik Shynkarenko
24

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:

"@angular/router": "^3.3.1"

Luego, en su app.module, importe el enrutador y configure las rutas:

import { RouterModule } from '@angular/router';

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent}
        ])
    ],

Actualización :

Mueva el AppRoutingModule para ser el primero en las importaciones:

imports: [
    AppRoutingModule.
    BrowserModule,
    FormsModule,
    HttpModule,
    AlertModule.forRoot(), // What is this?
    LayoutModule,
    UsersModule
  ],
Ben Richards
fuente
Esto no resolvió el problema. ¿Pueden consultar mi actualización?
Umair Sarfraz
@Ben - "forRoot ()" significa que está llamando a un método definido en un módulo importado que ejecuta la configuración o configuración para el módulo. También puede definir un método como "forChild ()" en un módulo personalizado y llamarlo, si lo desea. Este método se utiliza para tareas como configurar un proveedor para un servicio. También es cómo obtener un servicio Singleton en Angular. Ver angular.io/guide/singleton-services
RoboBear
10

Agregaré otro caso en el que recibí el mismo error pero solo siendo un tonto. Había agregado [routerLinkActiveOptions]="{exact: true}"sin agregar aún routerLinkActive="active".

Mi código incorrecto fue

<a class="nav-link active" routerLink="/dashboard" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

cuando debería haber sido

<a class="nav-link active" routerLink="/dashboard" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

Sin tener routerLinkActive, no puedes tener routerLinkActiveOptions.

cchapman
fuente
3

Cuando nada más funcione cuando debería funcionar, reinicie ng serve. Es triste encontrar este tipo de errores.

Tudor
fuente
2
Puede conformarse hay un error. Seguí eliminando el contenido de la carpeta dist y reconstruyéndolo. Finalmente funcionó. Intente agregar un enlace a cada componente en app.component.ts. Si eso no funciona, su única opción es la oración y el ayuno.
Sam
1

En mi caso, solo necesito importar mi componente recién creado a RouterModule

{path: 'newPath', component: newComponent}

Luego, en su app.moduleimportación, el enrutador y configure las rutas:

importar {RouterModule} desde '@ angular / router';

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent},
            {path: 'newPath', component: newComponent}
        ])
    ],

Espero que esto ayude a alguien !!!

Akitha_MJ
fuente
1

Es necesario añadir RouterMoudleen importslas secciones del módulo que contiene el Headercomponente

Hung Vu
fuente