【问题标题】:<router-outlet> doesn't work in Angular 9<router-outlet> 在 Angular 9 中不起作用
【发布时间】:2020-04-20 21:50:55
【问题描述】:

我遇到了 angular 9 的一些问题,无法正常工作。 我的文件是这样的:

routes.ts

import { LayoutComponent } from './../layout/layout.component';
import { Routes } from '@angular/router';

export const routes: Routes = [
  { path: '', component: LayoutComponent, children: [
    { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
    { path: 'dashboard', loadChildren: () => import('./dashboard/dashboard.module').then((m) => m.DashboardModule)},
    { path: 'table', loadChildren: () => import('./table/table.module').then((m) => m.TableModule)},
    { path: 'form', loadChildren: () => import('./form/form.module').then((m) => m.FormModule)}
  ]}
];

app-routes.moudule.ts

import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { routes } from './routes';

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

app.module.ts

import { LayoutModule } from './layout/layout.module';
import { AppRoutesModule } from './routes/app-routes.module';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    LayoutModule,
    AppRoutesModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

layout.component.html

<p>layout works! works</p>
<router-outlet></router-outlet>

layout.module.ts

import { LayoutComponent } from './layout.component';
import { NgModule } from '@angular/core';

@NgModule({
  declarations: [LayoutComponent],
  exports: [LayoutComponent]
})
export class LayoutModule {}

当我运行 ng serve 时,它​​总是提示:

块引用

src/app/layout/layout.component.html:2:1 中的错误 - 错误 NG8001:'router-outlet' 不是已知元素: 1.如果'router-outlet'是一个Angular组件,那么验证它是这个模块的一部分。 2. 如果“router-outlet”是一个 Web 组件,则将“CUSTOM_ELEMENTS_SCHEMA”添加到该组件的“@NgModule.schemas”以禁止显示此消息。

2 <router-outlet></router-outlet>
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  src/app/layout/layout.component.ts:5:16
    5   templateUrl: './layout.component.html',
                     ~~~~~~~~~~~~~~~~~~~~~~~~~
    Error occurs in the template of component LayoutComponent.

块引用

有人可以帮我弄清楚吗?

另外,在 layout.component.html 文件中,不显示子内容,例如表单组件、表格组件或仪表板组件。

有什么建议吗?

【问题讨论】:

  • LayoutModuleAppModule 是不同的模块,你只在AppModule 声明路由,LayoutModule 不知道路由器
  • 我在app.module.ts中导入了layoutmodule,这里我也导入了路由模块,所以layout模块应该知道路由。对吗?
  • 我认为你把事情复杂化了,如果有的话,你必须将 RoutingModule 导入 LayoutModule 以便它知道路由器出口;如果将使用路由的组件是 LayoutComponent,而不是 AppComponent,则 LayoutComponent 应该将路由模块导入其中
  • 但我的想法是 app.module 只是为了入口,它使用路由显示布局组件,只有标题和侧边菜单,然后布局组件使用路由显示子项,这是详细内容.这就是为什么我这样放置代码的原因。但是,我的问题是为什么 angular think router-outlet 不是已知元素,但我在导入布局模块的地方导入 routermodule。
  • 我建议再次阅读 Angular 文档,我明白你想要做什么,问题是 Angular 不能那样工作,以便 Module可以访问指令或组件,必须将它们导入在该模块中,将模块导入另一个具有您需要的模块将不起作用,因为每个模块只能访问其中的内容.. .在您的情况下,AppModule 知道 router-outlet 因为它是直接导入其中的,但 LayoutModule 不知道,因为路由模块仅在 AppModule 中,而不在 LayoutModule 中

标签: angular


【解决方案1】:

让我们开始吧。

您有以下模块:

  • 应用模块
  • 布局模块
  • AppsRouteModule(只是一个路由模块)

在 Angular 中,当您创建一个模块时,该模块只能访问您在其中声明的组件、指令等。

AppModule

此 AppModule 可以访问您在其中声明的任何组件或指令,或您从其中一个模块中导出的任何其他元素(如 LayoutModule)

import { LayoutModule } from './layout/layout.module';
import { AppRoutesModule } from './routes/app-routes.module';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    LayoutModule,
    AppRoutesModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

布局模块

然后我们就有了 LayoutModule,它里面只声明了 LayoutComponent。

import { LayoutComponent } from './layout.component';
import { NgModule } from '@angular/core';

@NgModule({
  declarations: [LayoutComponent],
  exports: [LayoutComponent]
})
export class LayoutModule {}

通过此设置,您从 LayoutModule 导出的所有内容都可以在 AppModule 中使用,但 LayoutModule 无法访问 AppModule 中声明的内容,它是AppModule,如果你愿意的话。

由于路由模块只在 AppModule 中声明,LayoutModule 不知道,Angular 根本不会处理这样的模块,如果你想在 LayoutModule 中使用路由,将它导入到那个模块中,它您想在两者中都使用路由模块(我认为这不是一件好事),您应该创建一个 SharedModule,在其中导入和导出路由模块,然后在 App 和 Layout 模块中导入 SharedModule。

【讨论】:

  • 感谢您的耐心解释。我尝试了您的建议,并且有效。然而,我发现了另一个奇怪的问题。我只在布局模块中导入 RouterModule(但不是我创建的 AppRoutesModule),它仍在工作。为什么? RouterModule angular 拥有的应该不知道我创建的路由,但是为什么路由仍然正确?
  • 我猜你在 AppModule 上的路由是全局的,所以如果你的 routerLink 指向那个特定的路由,它就会简单地匹配,因为路由已经加载到应用程序中,这要归功于应用模块
  • 在我的代码中发现我刚刚测试的另一件事是在我的布局模块中,即使我不导出布局组件和标题组件,代码仍然可以工作。布局和标题组件中的内容仍在呈现。这意味着如果 A 模块导入 B 模块,在 A 模块中声明了几个组件,但在 A 模块中没有导出,在导入 B 模块后,B 模块仍然可以识别 A 模块中的组件,并且可以使用它们。这有意义吗?
  • 如果您在声明的模块中使用您的组件,那么它将毫无问题地工作,如果您在 LayoutModule 中使用 LayoutComponent,那么无论 LayoutModule 将任何内容导出到 AppModule
  • 你是绝对正确的。非常感谢您的精彩回复,这对我很有帮助。
【解决方案2】:

你必须导入 RouterModule

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

@NgModule({
  imports: [RouterModule.forChild()]
})
export class LayoutModule {}

更好的方法

layout.component.html

<p>layout works! works</p>
<ng-content></ng-content>

app.component.html

<app-layout>
  <router-outlet></router-outlet>
</app-layout>

【讨论】:

  • 感谢您的回答。在我的 layout.modue.ts 文件中,我导出布局组件,并将其导入到我导入 routemodule 的 app.module.ts 中,它应该可以工作,对吗?
  • 我不会在布局中使用路由
  • 是的,我不在布局模块中使用路由,这就是为什么我不在那里导入 routermodule,而是导出布局组件并将其导入到 app.module.ts 中导入路由器模块,所以逻辑布局路由器插座应该在我的代码中工作。不知道哪里出了问题。你能给我更多的解释吗?
  • Modules 只管理导入其中的内容,如果您在 AppComponent 中导入 RoutingModule 则该模块中的每个组件都可以使用它,但由于 LayoutModule 是 另一个 模块,它只管理其中的重要内容。这就是为什么建议创建一个 SharedModule ,您可以在需要相同组件、指令等的任何地方导入它。在您的情况下,您应该从一个地方管理路由,即 AppModule,因此 LayoutModule 不会知道关于它,在 AppModule 中导入无关紧要,LayoutModule 里面的内容不知道路由器模块
  • LayoutModule 不知道模块外的组件
猜你喜欢
  • 2020-12-01
  • 2018-05-08
  • 2020-06-03
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2017-10-03
  • 1970-01-01
相关资源
最近更新 更多