【问题标题】:Organizing Angular feature modules and their sub-modules with routing使用路由组织 Angular 功能模块及其子模块
【发布时间】:2018-08-13 18:19:35
【问题描述】:

我正在尝试遵循 Angular 中的功能模块方法。

我有一个带有管理模块的应用程序。 此模块中将包含子模块(即用户管理、项目管理)。

下面是我想出的结构:

app.component.css
app.component.html
app.component.ts
app.module.ts
app-routing.module.ts

   admin/
      admin.component.css
      admin.component.html
      admin.component.ts
      admin.module.ts
      admin-routing.module.ts

      user-management/
         user-management.component.css
         user-management.component.html
         user-management.component.ts
         user-management.module.ts
         user-management-routing.module.ts

         user-list/
            user-list.component.css
            user-list.component.html
            user-list.component.ts

         user-detail/
            user-detail.component.css
            user-detail.component.html
            user-detail.component.ts

      project-management/
         project-management.component.css
         project-management.component.html
         project-management.component.ts
         project-management.module.ts
         project-management-routing.module.ts

         project-list/
            project-list.component.css
            project-list.component.html
            project-list.component.ts

         project-detail/
            project-detail.component.css
            project-detail.component.html
            project-detail.component.ts

如果我错了,请纠正我,但我相信上述结构是教科书式的。我真的很难用这种方法进行路由。

请在下方查看我的路线:

const appRoutes: Routes = [
   { path: 'admin', loadChildren: './admin/admin.module#AdminModule', canLoad: 
  [AuthGuard] },
  { path: '',   redirectTo: '/login', pathMatch: 'full' },
  { path: '**', component: PageNotFoundComponent }
];

    const adminRoutes: Routes = [
      {
        path: '',
        component: AdminComponent,
        canActivate: [AuthGuard],
        children: [
          {
            path: '',
            canActivateChild: [AuthGuard],
            children: [
              { path: 'users', component: UserManagementComponent },
              { path: 'projects', component: ProjectManagementComponent }
            ]
          }
        ]
      }
    ];

    const manageUsers: Routes = [
      {path: 'users', component: UserListComponent},
      {path: 'users/edit/:id', component: UserDetailComponent}
    ];

    const manageProjects: Routes = [
      {path: 'projects', component: ProjectListComponent},
      {path: 'projects/edit/:id', component: ProjectDetailComponent}
    ];

我希望导航的方式如下:

/admin(除了 admin.component.html 布局之外什么都不显示 - 总有一天会显示仪表板组件)
/admin/users(显示用户列表)
/admin/users/edit/1(显示用户的详细信息)

我认为我的主要困难在于我有一个用户管理组件,而默认情况下真正应该在其上显示的是用户列表组件。 admin.component.html 中有一个 router-outlet,user-management.component.html 中有一个 router-outlet。这样的事情是否需要双路由出口,还是应该直接在 user-management-component.html 页面上显示而不是路由器出口?

【问题讨论】:

    标签: angular typescript angular-routing


    【解决方案1】:

    这是一个直接对应于您提出的 module 组件层次结构的路由结构:

    const appRoutes: Routes = [
      {
        path: 'admin',
        component: AdminComponent, // has <router-outlet>
        children: [
          {
            path: 'users',
            component: UserManagementComponent, // has <router-outlet>
            children: [
              {
                path: '',
                component: UserListComponent
              },
              {
                path: 'edit/:id',
                component: UserDetailComponent
              }
            ]
          },
          {
            path: 'projects',
            component: ProjectManagementComponent, // has <router-outlet>
            children: [
              {
                path: '',
                component: ProjectListComponent
              },
              {
                path: 'edit/:id',
                component: ProjectDetailComponent
              }
            ]
          }
        ]
      },
      { path: '', redirectTo: '/admin' },
      { path: '**', component: PageNotFoundComponent }
    ];
    

    这将为您提供一个主“管理”页面,除了模板中的 HTML(如果它包含除 &lt;router-outlet&gt; 之外的任何内容)之外,它不会显示任何内容。当导航到/admin/users 时,它会在UserManaementComponent 内显示UserListComponent(考虑到UserManagementComponent 有一个&lt;router-outlet&gt;)。如果您单击指向/admin/users/edit/:id 的链接(其中:id 是某个ID),那么UserListComponent 将与UserManagementComponent 内的UserDetailComponent 交换。

    “项目”方面也是如此。

    编辑

    如果你想分解成功能模块,你可以这样做:

    app-routing/module.ts

    // From app-routing.module.ts
    const appRoutes: Routes = [
      {
        path: 'admin',
        loadChildren: './admin/admin.module#AdminModule',
        canLoad: [AuthGuard]
      },
      { path: '',   redirectTo: '/login', pathMatch: 'full' },
      { path: '**', component: PageNotFoundComponent }
    ];
    

    /admin/admin-routing.module.ts

    // From /admin/admin-routing.module.ts
    const ADMIN_ROUTES: Routes = [
      {
        path: '',
        component: AdminComponent,
        canActivate: [AuthGuard],
        children: [
          {
            path: '',
            canActivateChild: [AuthGuard],
            children: [
              { path: 'users', loadChildren: './admin/user-management/user-management.module#UserManagementModule' },
              { path: 'projects', loadChildren: './admin/project-management/project-management.module#ProjectManagementModule' }
            ]
          }
        ]
      }
    ];
    

    /admin/user-management/user-management-routing.module.ts

    // From /admin/user-management/user-management-routing.module.ts
    const USER_MANAGEMENT_ROUTES: Routes = [
      {path: '', component: UserListComponent},
      {path: 'edit/:id', component: UserDetailComponent}
    ];
    

    /admin/project-management/project-management-routing.module.ts

    // From /admin/project-management/project-management-routing.module.ts
    const PROJECT_MANAGEMENT_ROUTES: Routes = [
      {path: '', component: ProjectListComponent},
      {path: 'edit/:id', component: ProjectDetailComponent}
    ];
    

    【讨论】:

    • 谢谢!这正是我一直在寻找的。是的,UserManagementComponent 里面只有一个路由器插座,没有别的。现在去看看它是否有效。
    • 另外,如果您的appRoutes 结构变得非常大,您可以将其拆分,就像您的问题一样,但是应该小心使用它,以便您仍然实现适当的嵌套.通过一起查看子树来推断路线要容易得多。
    • 是的,你可以看到 Admin 有路由,另外每个子模块都有路由。最小的事情可能会导致问题,特别是如果它们以不正确的顺序导入。我想我会照你说的做,把所有东西都放在 app-routing 中,然后慢慢破解。
    • 如果您在我的帖子中查看我的管理路由,您会发现我使用的是无组件路由。我想这不是我应该做的,并且像你一样在这里使用 UserManagementComponent。有意义吗?
    • 如果您实际上要将功能分离到功能模块中(如您所提到的),那将是有效的,但您仍然需要确保您的路由嵌套是有效的,以便每个孩子都有一个&lt;router-outlet&gt; 在加载该路由时占用(有点难以判断您是否正在为路由加载单独的模块)。
    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 2020-06-28
    • 2018-01-28
    • 2011-05-05
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多