我想使用两个单独的路由配置和两个router-outlet 来实现嵌套路由.然而,我遇到了一个问题,我无法在我的独立组件中提供路由,该组件加载在router-outlet 本身中.

我希望在不(如果可能的话)将所有路由路径添加到我的应用程序路由的情况下实现什么: Structure I would like to achieve

我try 为我的组件(两个组件,见上图)提供路由,该组件加载在router-outlet 本身中:

import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { RouterModule, Routes, provideRouter } from '@angular/router';

export const twoRoutes: Routes = [
    {
        path: 'three',
        loadComponent: () => import('./three.component').then(a => a.ThreeComponent),
    },
    {
        path: 'four',
        loadComponent: () => import('./four.component').then(a => a.FourComponent),
    },
];

@Component({
    selector: 'app-two',
    standalone: true,
    imports: [CommonModule, RouterModule],
    providers: [provideRouter(twoRoutes)],
    template: `
        <div>Hello Component TWO</div>
        <router-outlet></router-outlet>
    `,
    styles: ``,
})
export class TwoComponent {}

错误: using provideRouter in a stand-alone component

我希望有一种方法可以在我的独立组件中定义我的嵌套路由,而不是必须将所有这些路由路径添加到我的应用程序路由和子程序中.

UPDATE: 我用loadChildren算出了以下结果,但我个人并不喜欢这样,因为这需要我更新应用程序的路由,让它知道嵌套的路由:

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

export const routes: Routes = [
    {
        path: 'one',
        loadComponent: () => import('./one.component').then(a => a.OneComponent),
    },
    {
        path: 'two',
        loadComponent: () => import('./two.component').then(a => a.TwoComponent),
        loadChildren: () => import('./two.component').then(t => t.twoRoutes),
    },
];

推荐答案

更新

如果你不想走独立的路由,你需要用角形classic 的布线方法配合模块布线,最重要的一点是我们需要在布线中使用component,如果我们使用loadComponent,那么组件必须是独立的组件!

两个模块

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TwoComponent } from './two.component';
import { ThreeComponent } from './three/three.component';
import { FourComponent } from './four/four.component';
import { TwoRoutingModule } from './two.routing.module';

@NgModule({
  imports: [CommonModule, TwoRoutingModule, CommonModule],
  declarations: [TwoComponent, ThreeComponent, FourComponent],
})
export class TwoModule {}

两个路由

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { FourComponent } from './four/four.component';
import { ThreeComponent } from './three/three.component';
import { TwoComponent } from './two.component';

const twoRoutes: Routes = [
  {
    path: '',
    component: TwoComponent,
    children: [
      {
        path: 'three',
        component: ThreeComponent,
      },
      {
        path: 'four',
        component: FourComponent,
      },
    ],
  },
];

@NgModule({
  imports: [RouterModule.forChild(twoRoutes)],
  exports: [RouterModule],
})
export class TwoRoutingModule {}

stackblitz


问得好!

我认为你只需要在根级别提供provideRouter,所有其他导入都是使用loadChildren派生的,请在下面找到工作示例供您参考.通过这种方法,所有组件都需要独立,如果需要,您也可以使用模块.

import { Component } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
import { RouterModule, Routes, provideRouter } from '@angular/router';

export const routes: Routes = [
  {
    path: 'one',
    loadComponent: () =>
      import('./one/one.component').then((a) => a.OneComponent),
  },
  {
    path: 'two',
    loadComponent: () =>
      import('./two/two.component').then((a) => a.TwoComponent),
    loadChildren: () =>
      import('./two/two.component').then((t) => {
        console.log(t.TwoComponent.twoRoutes);
        return t.TwoComponent.twoRoutes;
      }),
  },
];

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [RouterModule],
  template: `
  <a routerLink="/one">one</a> | 
  <a routerLink="/two">two</a>
    <router-outlet></router-outlet>
  `,
})
export class App {
  name = 'Angular';
}

bootstrapApplication(App, {
  providers: [provideRouter(routes)],
});

两个组件

import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { RouterModule, Routes, provideRouter } from '@angular/router';

@Component({
  selector: 'app-two',
  template: `
  <br/>
  <a routerLink="./three">three</a> | 
  <a routerLink="./four">four</a>
  <div>Hello Component TWO</div>
  <router-outlet></router-outlet>
  `,
  standalone: true,
  imports: [CommonModule, RouterModule],
  providers: [],
  styleUrls: ['./two.component.css'],
})
export class TwoComponent {
  static twoRoutes: Routes = [
    {
      path: 'three',
      loadComponent: () =>
        import('../three/three.component').then((a) => a.ThreeComponent),
    },
    {
      path: 'four',
      loadComponent: () =>
        import('../four/four.component').then((a) => a.FourComponent),
    },
  ];
}

working stackblitz

Angular相关问答推荐

无法执行CanDeactivateFn Karma Test Angular 16

当try 使用Angular和PrimeNg手动聚焦输入时,我做错了什么?

尾风手风琴中的Ngor

更改物料设计中的复选框勾选 colored颜色

图像未显示在视图屏幕上-Angular 投影

独立Angular 零部件不在辅零部件或共享零部件中工作

如果我只在组件中使用某个主题,是否需要取消订阅该主题?

如何将 Firebase 云消息传递 (FCM) 与 Angular 15 结合使用?

在Angular中扩展多个类

相同的 Angular 代码在生产环境中停止工作

Nx Angular Monorepo 中 cypress 组件测试的代码覆盖率?

Aws 代码部署在 BeforeBlockTraffic 步骤失败,即使在更新策略后也会超时

RxJS 基于先前的数据响应执行请求(涉及循环对象数组)

ERROR 错误:StaticInjectorError(AppModule)[UserformService -> HttpClient]:

ConnectionBackend 没有提供程序

Angular 2 中的 OnChanges 和 DoCheck 有什么区别?

有条件地将 RouterLink 或其他属性指令添加到 Angular 2 中的元素

Angular 4 错误:没有 HttpClient 的provider提供者

如何使用无头浏览器运行测试?

Firebase 查询子项的子项是否包含值