'router-outlet' não é um elemento conhecido

102

Eu tenho um projeto mvc 5 com uma interface angular. Eu queria adicionar o roteamento conforme descrito neste tutorial https://angular.io/guide/router . Então no meu _Layout.cshtmleu adicionei um

<base href="/">

e criei meu roteamento em meu app.module. Mas quando eu executo isso, recebo o seguinte erro:

Error: Template parse errors:
    'router-outlet' is not a known element:
    1. If 'router-outlet' is an Angular component, then verify that it is part       of this module.
    2. If 'router-outlet' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA'   to the '@NgModule.schemas' of this component to suppress this message. ("
    <a routerLink="/dashboard">dashboard</a>
    </nav>
    [ERROR ->]<router-outlet></router-outlet>
     "): ng:///AppModule/AppComponent.html@5:0

No meu app.component a linha

<router-outlet></router-outlet>

dá um erro informando que o Visual studio não consegue resolver a tag 'router-outlet' Alguma sugestão de como posso corrigir esse erro? Estou perdendo uma referência ou uma importação ou apenas esquecendo algo?

Abaixo estão meus package.json, app.component e app.module

package.json:

{
    "version": "1.0.0",
    "name": "app",
    "private": true,
    "scripts": {},
    "dependencies": {
    "@angular/common": "^4.2.2",
    "@angular/compiler": "^4.2.2",
    "@angular/core": "^4.2.2",
    "@angular/forms": "^4.2.2",
    "@angular/http": "^4.2.2",
    "@angular/platform-browser": "^4.2.2",
    "@angular/platform-browser-dynamic": "^4.2.2",
    "@angular/router": "^4.2.2",
    "@types/core-js": "^0.9.41",
    "angular-in-memory-web-api": "^0.3.2",
    "bootstrap": "^3.3.7",
    "core-js": "^2.4.1",
    "graceful-fs": "^4.0.0",
    "ie-shim": "^0.1.0",
    "minimatch": "^3.0.4",
    "reflect-metadata": "^0.1.10",
    "rxjs": "^5.0.1",
    "systemjs": "^0.20.12",
    "zone.js": "^0.8.12"
    },
    "devDependencies": {
    "gulp": "^3.9.1",
    "gulp-clean": "^0.3.2",
    "gulp-concat": "^2.6.1",
    "gulp-tsc": "^1.3.2",
    "gulp-typescript": "^3.1.7",
    "path": "^0.12.7",
    "typescript": "^2.3.3"
    }
}

app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { RouterModule, Routes } from '@angular/router';

import { AppComponent } from './app.component';
import {DashboardComponent} from "./dashboard/dashboard.component"    

const appRoutes: Routes = [
{
    path: '',
    redirectTo: '/dashboard',
    pathMatch: 'full',
    component: DashboardComponent
},  
{
    path: 'dashboard',
    component: DashboardComponent
}
];
@NgModule({
imports: [
    RouterModule.forRoot(appRoutes),
    BrowserModule,
    FormsModule               
],
exports: [RouterModule],
declarations: [
    AppComponent,  
    DashboardComponent      
],
bootstrap: [AppComponent]
})
export class AppModule {

}

app.component.ts:

import { Component } from '@angular/core';

@Component({
selector: 'my-app',
template: `
          <h1>{{title}}</h1>
          <nav>
          <a routerLink="/dashboard">dashboard</a>
          </nav>
          <router-outlet></router-outlet>
          `
})
export class AppComponent {
    title = 'app Loaded';

}
Molo
fonte

Respostas:

71

Experimente com:

@NgModule({
  imports: [
      BrowserModule,
      RouterModule.forRoot(appRoutes),
      FormsModule               
  ],
  declarations: [
      AppComponent,  
      DashboardComponent      
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Não há necessidade de configurar as exportações no AppModule, pois AppModulenão serão importadas por outros módulos da sua aplicação.

Jota.Toledo
fonte
1
Eu não entendo o que você quer dizer
Jota.Toledo
@ Jota.Toledo Eu criei um arquivo de módulo separado para roteamento onde eu defini rotas. Também tenho BrowserModule, FormsModule nas importações app.module e todos os três no arquivo do módulo de roteamento. Mas ainda estou recebendo este erro. Qualquer conselho?
ninja_md
1
@ninja_md Você adicionou uma declaração de exportação ao arquivo do módulo de roteamento? Como a seguir. @NgModule({ imports: [ RouterModule.forRoot(appRoutes) ], exports: [ RouterModule ] }) Eu estava recebendo o mesmo erro e isso resolveu meu problema.
Mihir Kagrana
86

Experimente isto:

Importar RouterModulepara o seuapp.module.ts

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

Adicione RouterModuleem seuimports []

como isso:

 imports: [    RouterModule,  ]
Shubham Verma
fonte
5
Ótimo, isso resolveu meu 'router-outlet' is not a known elementproblema. para Angular CLI version: 6.0.8eAngular version: 6.0.5
Shams
37

Se você estiver fazendo testes unitários e obter este erro, em seguida, importação RouterTestingModuleem seu app.component.spec.tsou dentro de seus componentes em destaque spec.ts:

import { RouterTestingModule } from '@angular/router/testing';

Adicione RouterTestingModuleao seu imports: []gosto

describe('AppComponent', () => {

  beforeEach(async(() => {    
    TestBed.configureTestingModule({    
      imports: [    
        RouterTestingModule    
      ],
      declarations: [    
        AppComponent    
      ],    
    }).compileComponents();    
  }));
Muhammad Adeel Malik
fonte
3
Obrigado cara você salvou meu dia.
Beto Silva
12

Supondo que você esteja usando Angular 6 com angular-cli e tenha criado um módulo de roteamento separado que é responsável pelas atividades de roteamento - configure suas rotas no array Routes. Certifique-se de declarar RouterModule no array extensions. O código ficaria assim:

@NgModule({
      imports: [
      RouterModule,
      RouterModule.forRoot(appRoutes)
     // other imports here
     ],
     exports: [RouterModule]
})
export class AppRoutingModule { }
Manit
fonte
Criei um arquivo de módulo separado para roteamento, conforme mencionado em sua resposta. Também tenho BrowserModule, FormsModule nas importações app.module e RouterModule no arquivo AppRouting. Mas ainda estou recebendo este erro. Você pode ajudar?
ninja_md
Um pouco de código ajudaria - parte do módulo de roteamento e a parte do módulo de app.
Manit
1
ninja_md Importe seu módulo de roteamento no array de importações app.module. a segunda mudança seria que no módulo de roteamento sob @NgModule na matriz de exportações forneça o nome de seu arquivo de módulo que você criou para roteamento. Espero que isto resolva o seu problema.
M.Sharma
8

Funciona para mim, quando adiciono o seguinte código em app.module.ts

@NgModule({
...,
   imports: [
     AppRoutingModule
    ],
...
})
Jigar Bhatt
fonte
4

Obrigado, exemplo do Editor Hero, onde encontrei a definição correta:

Quando eu gerar o módulo de roteamento de aplicativo:

ng generate module app-routing --flat --module=app

e atualize o arquivo app-routing.ts para adicionar:

@NgModule({
  imports: [ RouterModule.forRoot(routes) ],
  exports: [ RouterModule ]
})

Aqui estão os exemplos completos:

import { NgModule }             from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

import { DashboardComponent }   from './dashboard/dashboard.component';
import { HeroesComponent }      from './heroes/heroes.component';
import { HeroDetailComponent }  from './hero-detail/hero-detail.component';

const routes: Routes = [
  { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
  { path: 'dashboard', component: DashboardComponent },
  { path: 'detail/:id', component: HeroDetailComponent },
  { path: 'heroes', component: HeroesComponent }
];

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

e adicione AppRoutingModule às importações de app.module.ts:

@NgModule({
  declarations: [
    AppComponent,
    ...
  ],
  imports: [
    BrowserModule,
    FormsModule,
    AppRoutingModule
  ],
  providers: [...],
  bootstrap: [AppComponent]
})
Kamlesh
fonte
1

É melhor criar um componente de roteamento que administre todas as suas rotas! Da documentação do site angular! Essa é uma boa prática!

ng gerar módulo app-routing --flat --module = app

A CLI acima gera um módulo de roteamento e adiciona ao seu módulo de app, tudo que você precisa fazer a partir do componente gerado é declarar suas rotas, também não se esqueça de adicionar isto:

exports: [
    RouterModule
  ],

para o decorador do módulo ng, pois ele não vem com o módulo de roteamento de aplicativo gerado por padrão!

Seyi Daniels
fonte
0

Existem duas maneiras. 1. se você deseja implementar o app.module.tsarquivo:

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

const appRoutes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'user', component: UserComponent },
  { path: 'server', component: ServerComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
  ]
})
export class AppModule { }

  1. se você deseja implementar o app-routing.module.tsarquivo (Módulo de roteamento separado):

//app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const appRoutes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'users', component: UsersComponent },
  { path: 'servers', component: ServersComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

//................................................................

//app.module.ts
import { AppRoutingModule } from './app-routing.module';

@NgModule({
  imports: [
    AppRoutingModule
  ]
})
export class AppModule { }

Shatu
fonte
0

No meu caso aconteceu porque RouterModule falhou na importação.

Yibela
fonte
-1

Esse problema também estava comigo. Truque simples para isso.

 @NgModule({
  imports: [
   .....       
  ],
 declarations: [
  ......
 ],

 providers: [...],
 bootstrap: [...]
 })

use-o como na ordem acima. Primeiro as importações, depois as declarações. Funcionou para mim.

Susampath
fonte
-2

Em seu arquivo app.module.ts

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

const appRoutes: Routes = [
{
    path: '',
    redirectTo: '/dashboard',
    pathMatch: 'full',
    component: DashboardComponent
},  
{
    path: 'dashboard',
    component: DashboardComponent
}
];

@NgModule({
imports: [
    BrowserModule,
    RouterModule.forRoot(appRoutes),
    FormsModule               
],
declarations: [
    AppComponent,  
    DashboardComponent      
],
bootstrap: [AppComponent]
})
export class AppModule {

}

Adicione este código. Happy Coding.

Vinayak Savale
fonte
-3

Aqui está a solução rápida e simples se alguém está recebendo o erro:

"'roteador-saída' não é um elemento conhecido" no projeto angular,

Então,

Basta ir ao arquivo "app.module.ts" e adicionar a seguinte linha:

import { AppRoutingModule } from './app-routing.module';

E também 'AppRoutingModule' nas importações.

Shree
fonte