【问题标题】:'router-outlet' is not a known element'router-outlet' 不是已知元素
【发布时间】:2017-11-15 00:14:27
【问题描述】:

我有一个带有角度前端的 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 无法解析标签“路由器插座”。有什么建议可以解决这个错误吗?我是否缺少参考或导入或只是忽略了某些内容?

下面是我的 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.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';

}

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    RouterModule 导入您的app.module.ts

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

    RouterModule 添加到您的imports []

    像这样:

     imports: [    RouterModule,  ]
    

    【讨论】:

    • 太好了,这解决了我的'router-outlet' is not a known element 问题。对于Angular CLI version: 6.0.8Angular version: 6.0.5
    • 太好了,这也解决了我的'router-outlet' is not a known element 问题。对于Angular CLI version: 11.2.8Angular version: 11.2.9
    【解决方案2】:

    尝试:

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

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

    【讨论】:

    • 我不明白你的意思
    • @Jota.Toledo 我为路由创建了一个单独的模块文件,其中我定义了路由。此外,我在 app.module 导入中有 BrowserModule、FormsModule 和路由模块文件中的所有三个。但我仍然收到此错误。有什么建议吗?
    • @ninja_md 您是否在路由模块文件中添加了导出声明?如下所示。 @NgModule({ imports: [ RouterModule.forRoot(appRoutes) ], exports: [ RouterModule ] }) 我遇到了同样的错误,这解决了我的问题。
    【解决方案3】:

    如果您在进行单元测试并遇到此错误,请将 RouterTestingModule 导入到您的 app.component.spec.ts 或您的特色组件的 spec.ts 中:

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

    RouterTestingModule 添加到您的imports: []

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

    【讨论】:

    • 谢谢你救了我的一天。
    【解决方案4】:

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

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

    【讨论】:

    • 这是我的问题!我实现了一个单独的layout component,忘记将它添加到@NgModule.declarations
    • 非常感谢!
    • 这解决了我的问题,谢谢你的这个有趣的观点。
    【解决方案5】:

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

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

    【讨论】:

    • 我已经为您的回答中提到的路由创建了一个单独的模块文件。我还有 BrowserModule、app.module 导入中的 FormsModule 和 AppRouting 文件中的 RouterModule。但我仍然收到此错误。你能帮忙吗?
    • 一点代码会有所帮助 - 路由模块部分和应用程序模块部分。
    • ninja_md 在 app.module 导入数组中导入您的路由模块。第二个更改是在导出数组中@NgModule 下的路由模块中,给出您为路由创建的模块文件的名称。我希望这能解决您的问题。
    【解决方案6】:

    当我在 app.module.ts 中添加以下代码时,它对我有用

    @NgModule({
    ...,
       imports: [
         AppRoutingModule
        ],
    ...
    })
    

    【讨论】:

      【解决方案7】:

      感谢英雄编辑器示例,我在其中找到了正确的定义:

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

      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]
      })
      

      【讨论】:

        【解决方案8】:

        有时会无缘无故出现此错误,可通过打开和关闭您的 IDE 来解决。

        【讨论】:

          【解决方案9】:

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

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

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

          exports: [
              RouterModule
            ],
          

          到您的 ng-module 装饰器,因为它默认不附带生成的应用程序路由模块!

          【讨论】:

            【解决方案10】:

            我只在 VS Code 中遇到过这个问题,运行 ng serveng build --prod 运行良好。

            为我解决问题的方法是禁用 Angular 语言服务 扩展 (angular.ng-template),然后重新启用它。

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

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

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

                【讨论】:

                  【解决方案13】:

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

                  错误

                  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)
                    }
                  ]
                  

                  【讨论】:

                  • 即使我也犯了同样的错误
                  【解决方案14】:

                  有两种方法。 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 { }

                  【讨论】:

                    【解决方案15】:

                    在我的情况下,这是因为 RouterModule 在导入中丢失。

                    【讨论】:

                      【解决方案16】:

                      这个问题也和我有关。 简单的技巧。

                       @NgModule({
                        imports: [
                         .....       
                        ],
                       declarations: [
                        ......
                       ],
                      
                       providers: [...],
                       bootstrap: [...]
                       })
                      

                      按照上面的顺序使用它。首先导入然后声明。它对我有用。

                      【讨论】:

                        【解决方案17】:

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

                        添加此代码。 快乐编码。

                        【讨论】:

                          【解决方案18】:

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

                          “'router-outlet' 不是已知元素”在 Angular 项目中,

                          那么,

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

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

                          还有导入中的“AppRoutingModule”。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2020-05-23
                            • 1970-01-01
                            • 2021-05-08
                            • 2020-07-27
                            • 1970-01-01
                            • 1970-01-01
                            • 2018-05-20
                            • 2017-07-27
                            相关资源
                            最近更新 更多