【问题标题】:Angular2 RC6 - Nested modules with routingAngular2 RC6 - 带有路由的嵌套模块
【发布时间】:2017-01-22 09:05:44
【问题描述】:

在我的应用程序中,我有一个 SupportModule,它有 3 个子模块(AdminModuleChatModuleContactModule)。 SupportModule 及其 3 个子模块都有自己的路由定义。

结构看起来像

“AdminModule”的路由如下:

import { AdminComponent }   from './admin.component';
import { RssFeedsComponent }   from './rssFeeds.component';
import { RssFeedDetailComponent }   from './rssFeedDetail.component';

export const adminRoutes: Route =      
    {
        path: 'admin',
        component: AdminComponent,
        children: [
            { path: '',  component: RssFeedsComponent },
            { path: 'feeds',  component: RssFeedsComponent },
            { path: 'feeddetail', component: RssFeedDetailComponent }
        ]
    };    

SupportModule(三个子模块的父模块)的路由如下:

import { SupportComponent } from './support.component';
import { SupportNavComponent } from './support-nav.component';
//Feature Modules
import { chatRoutes } from './chat/chat.routing';
import { contactRoutes } from './contact/contact.routing';
import {adminRoutes} from './admin/admin.routing';

const supportRoutes: Routes = [     
    {
        path: 'support',
        component: SupportComponent,
        children: [
            { path: '',  component: SupportNavComponent },
            chatRoutes,
            contactRoutes,
            adminRoutes
        ]
    }  
];

export const supportRouting: ModuleWithProviders = RouterModule.forChild(supportRoutes);        

最后我将这个supportRouting 导入我的AppModule

导航工作正常,没有任何问题。但我有点困惑。我不知道这是否是让父子模块拥有自己的路由的正确方法,或者是否有更好的方法来实现这一点。

如果有人可以纠正我(如果我犯了错误)或知道更好的方法,那将非常有帮助。

【问题讨论】:

    标签: angular angular2-routing


    【解决方案1】:

    根据我对文档的阅读以及我自己对类似路由的经验,您所做的似乎与 Angular 推荐的风格一致。

    我刚刚在 Angular github 上遇到了 this discussion。我还没有尝试过,但看起来该链接提供了一种更好的方法。

    我试过了再回来。


    按照链接中的说明,我首先使用延迟加载进行了这项工作——因为这正是我真正想要的。

    我不确定你在寻找哪种方式。

    延迟加载是这样的:

    我的层次结构是

    |--App
    |    Home
    |    Costing
    |    |  Payments
    |       |   Payments List
    |       |   Payments Detail
    |    |  Variations
    |       | ...
    |    Admin
    |    |--Projects
    |       |...
    |    |--Users
    |       |...
    |  ...
    

    成本核算、付款、变化、管理、项目和用户都是模块。

    我的app.routing 然后看起来像这样:

    export const appRoutes: Routes =[
      {
        path: '',
        redirectTo: '/home',
        pathMatch: 'full'
      },
    
      {
        path: 'home',
        component: HomeComponent
      },
    
      { path: 'costing', loadChildren: 'app/costing/costing.module#CostingModule' },
    
      { path: 'admin', loadChildren: 'app/admin/admin.module#AdminModule' },
    
    ];
    
    export const appRoutingProviders: any[] = [
      authProviders,
    ];
    
    export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
    

    costing.routing 是:

    const routes: Routes = [
    
      {
        path: '', component: CostingComponent,
        children: [
    
         { path: '', component: EmptyComponent, pathMatch: 'full' },
         { path: 'payments', loadChildren: 'app/costing/payments/payments.module#PaymentsModule' },
         { path: 'variations', loadChildren: 'app/costing/variations/variations.module#VaritionsModule' }
        ]
      }
    ];
    
    export const costingRouting: ModuleWithProviders = RouterModule.forChild(routes);
    

    最后,payments.routing:

    const paymentsRoutes: Routes = [
    
      {
        path: '',
        component: PaymentsListComponent},
      {
        path: 'detail:id',
        component: PaymentsDetailComponent 
      },
    
    ];
    
    export const paymentsRouting: ModuleWithProviders = RouterModule.forChild(paymentsRoutes);
    

    我相信你可以用同步加载代替我的延迟加载。

    【讨论】:

    • 讨论链接似乎很有帮助。我会调查它,但请在这里分享你的发现
    • 谢谢克里斯。我也在延迟加载之后。你的例子很有帮助
    • @ChrisCurnow 如果我错了,请纠正我,但如果您不延迟加载 costing-routing.module 中的子模块并使用急切加载,则很难遵循 childRoutes 方法,例如。 .. costing.module 和 costing-routing.module、payments.module 和 payment-routing.module。如果您将 Payments-Routing.module 导入到 Payments.module 中,然后将 Payments.module 导入到 Costing.module 中,您会不会有路线干扰,付款路线不会作为子项放置在 Costing 路线中?你能举个例子说明你将如何在预加载中遵循同样的模式吗?
    • 您好,这可能看起来有点傻,但是我不明白为什么您为每个路由文件设置了空路径?
    • 我使用空路径作为默认路径。这意味着我可以直接到达我想去的第一层,它会到达我想去的地方。例如,如果我导航到支付模块,该模块的路由文件会将我路由到支付列表。因此,我不必对支付列表进行硬编码,只需更改路由文件中的默认值即可。
    【解决方案2】:

    我想这真的取决于你想要的样子。当 ngModules 出现时,我决定将所有东西模块化以保持在一起。我有一个包含许多路线的大型应用程序。我已将所有主要路由放置在 app.routing 中的功能模块中,如下所示:

    import { Routes } from '@angular/router';
    import { AuthGuardService } from './services/authGuard.service';
    
    export const appRoutes: Routes = [
        { path: '', redirectTo: '/home', pathMatch: 'full'  },
        { path: 'home',  loadChildren: './app/home/home.module#HomeModule' },
        { path: 'documents',  loadChildren: './app/documents/documents.module#DocumentsModule' },
        { path: 'calculator', loadChildren: './app/calculator/calculator.module#CalculatorModule'},
        { path: 'food',  loadChildren: './app/food/food.module#FoodModule'}, //canActivate: [ AuthGuardService ] },
        { path: 'themes',  loadChildren: './app/themes/themes.module#ThemesModule', canActivate: [ AuthGuardService ] },
        { path: 'settings',  loadChildren: './app/settings/settings.module#SettingsModule', canActivate: [ AuthGuardService ] },
        { path: 'about',  loadChildren: './app/about/about.module#AboutModule' }
    
    ];
    
    export const appRoutingProviders: any[] = [];
    

    然后在每个功能模块中我都这样做,例如:home.routing.ts:

    export const routing = RouterModule.forChild([
      { path: 'home', component: HomeComponent },
      { path: 'login', component: LoginComponent },
      { path: 'register', component: RegisterComponent },
      { path: 'verify', component: VerifyComponent },
      { path: 'challenge', component: ChallengeComponent },
      { path: 'verifyEmail/:id', component: VerifyEmailComponent },
      { path: 'change', component: ChangeComponent },
      { path: 'forgot/:id', component: ForgotComponent },
      { path: 'verifyPassword/:id', component: ForgotVerifyComponent },
      { path: 'verifyUserName/:id', component: ForgotVerifyComponent }
    ]);
    

    我对每个功能模块都这样做,我在路由方面没有任何问题,并且它保持模块化。

    【讨论】:

    • 我同意你提出的结构。我认为它非常灵活,并且在模块之间保持隔离,这对于大型项目很重要。
    • @JohnBaird 您是否曾经不得不使用嵌套功能模块更进一步?例如管理员/用户。 Admin 相当于您的 Home 模块,而不是仅仅有一堆组件创建另一个名为 Users 的功能模块(它将具有 User-List 和 User-Detail 组件)。我相信当您延迟加载子模块时会容易得多,因为如果您不这样做,我认为子模块的路由文件无论如何都不会作为子模块工作。如果我错了,请纠正我。只是想看看你对它的看法。因为我一直在努力实现它。
    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 2016-11-05
    • 2016-04-06
    • 2020-10-01
    • 1970-01-01
    • 2019-08-04
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多