'router-outlet'不是一个已知的元素

时间:2017-06-13 09:39:19

标签: angular asp.net-mvc-5 angular2-routing

我有一个带角度前端的mvc 5项目。我想按照本教程https://angular.io/guide/router中的说明添加路由。所以在我的_Layout.cshtml中我添加了一个

<base href="/">

并在我的app.module中创建了我的路由。但是当我运行这个时,我得到以下错误:

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

在我的app.component中行

<router-outlet></router-outlet>

给出一个错误,告诉我Visual Studio无法解析标签'router-outlet'。有任何建议我如何解决这个错误?我错过了引用或导入,或只是忽略了什么?

以下是我的package.json,app.component和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:

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:

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';

}

17 个答案:

答案 0 :(得分:35)

尝试:

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

}

无需在AppModule中配置导出,因为AppModule不会被应用程序中的其他模块导入。

答案 1 :(得分:27)

试试这个:

RouterModule导入app.module.ts

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

RouterModule添加到您的imports []

喜欢这样:

 imports: [    RouterModule,  ]

答案 2 :(得分:20)

对于那些已经在父模块中导入了 RoutingModule 的组件,有时问题是由于没有在模块声明中添加带有 <router-outlet></router-outlet> 的组件。

main.component.html

<router-outlet></router-outlet>

main.module.ts

import { MainComponent } from './main.component';
import { SharedModule } from './../shared/shared.module';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { MainRoutingModule } from './main-routing.module';
import { RouterModule } from '@angular/router';


@NgModule({
  declarations: [
    MainComponent // <----- DON'T FORGET TO DECLARE THIS
  ],
  imports: [
    CommonModule,
    SharedModule,
    RouterModule,
    MainRoutingModule
  ]
})
export class MainModule { }

答案 3 :(得分:14)

如果您正在执行单元测试并出现此错误,则将RouterTestingModule导入app.component.spec.ts或功能部件的spec.ts内

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

Add RouterTestingModule into your imports [] like 

describe('AppComponent', () => {

  beforeEach(async(() => {    
    TestBed.configureTestingModule({    
      imports: [    
        RouterTestingModule    
      ],
      declarations: [    
        AppComponent    
      ],    
    }).compileComponents();    
  }));

答案 4 :(得分:8)

假设您将Angular 6与angular-cli一起使用,并且创建了一个单独的路由模块来负责路由活动-在Routes数组中配置路由。请确保在exports数组中声明RouterModule。 代码如下:

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

答案 5 :(得分:3)

当我在app.module.ts

中添加以下代码时,它适用于我
@NgModule({
...,
   imports: [
     AppRoutingModule
    ],
...
})

答案 6 :(得分:2)

谢谢Hero编辑器示例,在其中找到了正确的定义:

当我生成应用程序路由模块时:

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

并更新app-routing.ts文件以添加:

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

完整示例如下:

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 {}

并将AppRoutingModule添加到app.module.ts导入中:

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

答案 7 :(得分:2)

最好创建一个可以处理所有路由的路由组件!从角网站文档!这是一个很好的做法!

ng生成模块app-routing --flat --module = app

上面的CLI生成一个路由模块并添加到您的应用程序模块,您需要从生成的组件中做的就是声明您的路由,也不要忘记添加它:

exports: [
    RouterModule
  ],

到您的ng-module装饰器,因为它默认没有生成的app-routing模块!

答案 8 :(得分:2)

我找到了一个对我有用的解决方案。为了进行测试,我创建了一个运行良好的新项目,然后逐渐消除了 app.component.html 中除了 router-outlet 线之外的所有内容。 这始终导致此错误。 我使用的是 VSCODE 版本 1.53.x,所以我升级到 1.54(2021 年 2 月),问题消失了。

答案 9 :(得分:2)

我只在 VS Code 中遇到过这个问题,运行 ng serveng build --prod 确实工作正常。

为我解决了这个问题的方法是简单地禁用 Angular Language Service 扩展 (angular.ng-template),然后重新启用它。

答案 10 :(得分:1)

这个问题也和我有关。 简单的把戏。

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

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

按上述顺序使用它。先导入然后进行声明。它对我有用。

答案 11 :(得分:1)

就我而言,这是延迟加载的错误。我指向的是路由模块,但它应该指向拥有路由模块的模块。

错误

const routes: Routes = [
  {
    path: 'Login',
    loadChildren: ()=> import('./login/login-routing.module.ts').then(m=> m.LoginRoutingModule)
  }
]

对了

const routes: Routes = [
  {
    path: 'Login',
    loadChildren: ()=> import('./login/login.module.ts').then(m=> m.LoginModule)
  }
]

答案 12 :(得分:0)

在您的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 {

}

添加此代码。 编码愉快。

答案 13 :(得分:0)

如果有人遇到错误,这里是快速简便的解决方案:

  

角度项目中的“路由器出口不是已知元素”,

然后

只需转到“ app.module.ts”文件并添加以下行:

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

还有导入中的“ AppRoutingModule”。

答案 14 :(得分:0)

就我而言,这是因为导入中遗漏了 RouterModule

答案 15 :(得分:0)

如果您手动创建 app-routing.module.ts 或使用 CLI 以外的工具来执行此操作,则需要将 AppRoutingModule 导入 app.module.ts 并将其添加到Ng 模块。 要使用 CLI 创建 app-routing.module.ts,请运行:

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

答案 16 :(得分:-1)

有两种方法。 1.如果要实现app.module.ts文件,则:

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. 如果您要实现app-routing.module.ts(分离路由模块)文件,则:

//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 { }