简体   繁体   English

如何在Angular2中添加ngModule路由作为另一个ngModule的子路由?

[英]How to add ngModule routes as child routes of another ngModule in Angular2?

I am following this tutorial to have an architecture of my application. 我正在遵循本教程,以获得我的应用程序的体系结构。

To give more information lets consider A as appModule, and B is another main module. 为了提供更多信息,我们可以将A视为appModule, B是另一个主要模块。 Now I want to load other modules ( NgModule which has many other routes) inside B's <router-outlet> . 现在我想在B的<router-outlet>加载其他模块( NgModule ,它有许多其他路由)。

What is a better approach to do this? 有什么更好的方法来做到这一点?

这就是我想要实现的目标

This is what I have done so far 这就是我到目前为止所做的

-mainBoard (Folder next to app.Module)
    --mainBoard Routes
    --mainBoard Component
    --mainHeader Component
    --mainFooter Component
    --mainSidenav Component

    -Users  (Folder inside mainBoard)
    --User Module
    --User Routes
    --UserList Component
    --UserDetail Component
    --UserSetting Component

    -Departments (Folder inside mainBoard)
    --Department Module
    --Department Routes
    --DepartmentList Component
    --DepartmentDetail Component

-Auth (Folder next to mainBoard folder)
    --Auth Module
    --Auth Component
    --Auth Routes
    -Sign-in (Folder)
    --Sign-in Component
    -Sign-up (Folder)
    --Sign-up Component

-App Module

I have 2 main modules, mainBoard and Auth. 我有2个主要模块,mainBoard和Auth。 MainBoard has a header, sidenav,footer and in the center I want to load Users and Department using <router-outlet> . MainBoard有一个标题,sidenav,footer,在中心我想使用<router-outlet>加载用户和部门。

I want to load localhost/app/users to load Userslist and localhost/app/department to load department list. 我想加载localhost/app/users来加载Userslist和localhost/app/department来加载部门列表。

My main-board.module and users.module look like this 我的main-board.module和users.module看起来像这样

// main-board.module.ts
import {MainBoardRouting} from './main-board.routes';

import {UsersModule} from './users/users.module';
import {DepartmentsModule} from './departments/departments.module';

@NgModule({
    imports :[
        MainBoardRouting,
        UsersModule,
        DepartmentsModule
    ],
    declarations : [
        MainBoardComponent,
        MainHeaderComponent,
        MainFooterComponent,
        MainSidenavComponent
    ],
    providers: []
})
export class MainBoardModule{}

// Users.module.ts // Users.module.ts

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

import {usersRouting} from './users.routes';
import {UserListComponent} from './user-list';
import {UserDetailComponent} from './user-detail';

@NgModule({
    imports :[
        usersRouting
    ],
    declarations : [
        UserListComponent,
        UserDetailComponent
    ],
    providers: []
})
export class UsersModule{}

// main-board.routes // main-board.routes

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

import {  MainBoardComponent  } from './main-board.component';

const MainBoardRoutes: Routes = [{
    path: 'app',
    component: MainBoardComponent
}];
export const MainBoardRouting = RouterModule.forChild(MainBoardRoutes);

// users route //用户路由

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

import { UserListComponent }    from './user-list';
import { UserDetailComponent }  from './user-detail';

export const usersRoutes: Routes = [
  {path: '', redirectTo: 'app/users', pathMatch:'full'},
  { path: 'users',  component: UserListComponent },
  { path: 'user/:id', component: UserDetailComponent }
];

export const usersRouting = RouterModule.forChild(usersRoutes);

Is my approach right to have child NgModule with their own routings or do I have to change them to simple component and have all the routes in main-board Module routes? 我的方法是否正确让孩子NgModule有自己的路线,或者我是否必须将它们更改为简单组件并在main-board模块路由中拥有所有路由?

Your methodology is correct. 你的方法是正确的。 In this approach one needs to import only childmodule into parentmodule , that's it. 在这种方法中,只需要将子模块导入父模块 ,就是这样。 Childmodule will take care of it's own routing. Childmodule将负责它自己的路由。 Similarly if you have nested modules, only modules need to be imported in parent routes rather than declaring lot of routes in one place. 类似地,如果您有嵌套模块,则只需要在父路由中导入模块,而不是在一个地方声明许多路由。

Your approach is right. 你的方法是对的。 You want to split the routes to their own sub-modules. 您希望将路由拆分为自己的子模块。 Technically you can move the routes to any module as they are merged but it will probably be a bad idea in the long term. 从技术上讲,您可以将路线移动到合并的任何模块,但从长远来看,这可能是一个坏主意。

Plunker with resulting routes https://plnkr.co/edit/Y9ReEwnBZNId48xX1CDR?p=preview 结果路线的吸虫https://plnkr.co/edit/Y9ReEwnBZNId48xX1CDR?p=preview

@Component({
  selector: 'users',
  template: `
    <div>
      <h2>Users</h2>
      <ul><li *ngFor="let user of users">{{user}}</li></ul>
    </div>
  `,
})
export class Users {
  users = ["John", "Joe"];
}

const usersRoutes = [
  {path: 'users', component: Users}
];
const UsersRoutes = RouterModule.forChild(usersRoutes);


@NgModule({
  imports: [ CommonModule, UsersRoutes ],
  declarations: [ Users ],
  exports: [ Users ]
})
export class UsersModule {}

As said before from others, but I would like to be a little bit clear. 如前所述,其他人,但我想有点清楚。 Using sub-Module to divide application features is very good, as the application grows they permit to keep a simple code structure. 使用子模块划分应用程序功能是非常好的,随着应用程序的增长,它们允许保持简单的代码结构。

The best way to manage this process is to have a folders structure like this: 管理此过程的最佳方法是使用如下文件夹结构:

src
   - featureA
     - featureA.routes.ts
     - fefatureA.module.ts
     - component1
       - component1.ts
       - [...]
     - component2
       - component2.ts
       - [...]
     - [...]

   - featureB
     - featureB.routes.ts
     - fefatureB.module.ts
     - component1
       - component1.ts
       - [...]
     - component2
       - component2.ts
       - [...]
     - [...]

   - [...]

   - app-routing.module.ts
   - app.module.ts

In every feature's module you declare the routes for this particoular module: file feature.routes.ts: 在每个功能的模块中,您声明此特定模块的路由:file feature.routes.ts:

const routerConfig: Routes = [
    {
        path: '',
        component: Component1
    },
    {
        path: 'other',
        component: Component2
    }
]

and they you import this routes in your feature's module file feature.module.ts: 并且您可以在功能的模块文件feature.module.ts中导入此路由:

    import { routerConfig } from "./feature.routes";
        @NgModule({
          imports: [ 
            RouterModule.forChild(routerConfig),
          ],
        })
export class FeatureModule{}

The last thing to do is to import all the stuff in your routing module, lazy loading is perfect for the performace of a tipical application. 最后要做的是导入路由模块中的所有内容,延迟加载非常适合于典型应用程序的性能。

file app-routing.module.ts: 文件app-routing.module.ts:

import { FeatureAModule } from './featureA/featureA.module';
import { FeatureBModule } from './featureB/featureB.module';
    @NgModule({
      imports: [
        RouterModule.forRoot([
          { path: '', loadChildren: ()=> require("./featureA/featureA.module")["FeatureAModule"]},
{ path: 'feature-b', loadChildren: ()=> require("./featureB/featureB.module")["FeatureBModule"]},
        ],  
        { preloadingStrategy: PreloadAllModules}) //Define the loading strategy
      ],
    })
    export class AppRoutingModule {}

And finnaly importing the routing module into your app module file app.module.ts: 最后将路由模块导入应用程序模块文件app.module.ts:

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

@NgModule({
  imports: [
    AppRoutingModule,
  ],
})
export class AppModule {}

您需要在路由定义中使用loadChildren属性,而不是路由器中的子节点,然后指向子模块(作为由“#”分隔的字符串,或作为返回模块的函数)

your approach is right you should divide your routing specific to the module like user module related routing goes in user module it will be very help full as the size of application grows now i think you should try these modification . 你的方法是正确的,你应该将你的路由特定分配给模块,就像用户模块相关的路由进入用户模块,随着应用程序的大小增长,它将非常有用,我认为你应该尝试这些修改。

//main-board routes file //主板路由文件

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

 import {  MainBoardComponent  } from './main-board.component';

  const MainBoardRoutes: Routes = [{
       path: 'app',
       component: MainBoardComponent
  }];
 export const MainBoardRouting = 
 RouterModule.forRoot(MainBoardRoutes); // use for root instead of for child 

What you need is loadChildren 你需要的是loadChildren

child.module.ts child.module.ts

const childRoutes: Routes = [
    {
        path: '',
        component: ChildComponentA
    },
    {
        path: 'other',
        component: ChildComponentB
    }
]

@NgModule({
    imports: [
        RouterModule.forChild(childRoutes)
    ]
})
class MyChildModule {}

app.module.ts app.module.ts

const appRoutes: Routes = [
    {
        path: 'children',
        // If using a function that returns the Module,
        // it will be "eager-loaded"
        loadChildren: () => MyChildModule
        // When using a string, it will be lazy-loaded
        // loadChildren: './path/to/child.module#MyChildModule'
    }
]

@NgModule({
    imports: [
        RouterModule.forRoot(appRoutes)
    ]
})
class AppModule {
}

hi below i have given a sample routing module for app.module and feature module. 我在下面给出了app.module和功能模块的示例路由模块。

app-routing module routing file contains the primary routes and feature module routing file contains the rooting for child roots. app-routing模块路由文件包含主路由和功能模块路由文件,包含子根的生根。 hope this helps the resulting roure is /feature/books 希望这有助于产生的特征/功能/书籍

app-routing.module.ts //import this in app.module.ts app-routing.module.ts //在app.module.ts中导入它

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

export const routes: Routes = [
  { path: 'feature', loadChildren: 'app/feature/feature.module#FeatureModule'},
  { path: '', redirectTo: 'feature', pathMatch: 'full' },
];

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

export class AppRoutingModule {
}

feature-routing.module.ts //import this in feature.module.ts feature-routing.module.ts //在feature.module.ts中导入它

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

// ---- components imported----
import { BooksComponent } from './books/books.component';
import { FeatureComponent } from './feature.component';

const featureRoutes: Routes = [

  {
    path: '',
    component: FeatureComponent,
    children: [
      {path: '', redirectTo: 'books', pathMatch: 'full'},
      {path: 'books', component: BooksComponent},
      {path: '**', redirectTo: 'books', pathMatch: 'full'},
    ]
  }
];

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

I have done this in my recent project. 我在最近的项目中做到了这一点。 Here is the sample 这是样本

app.routing.ts app.routing.ts

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

@NgModule({
imports: [
    RouterModule.forRoot([
        { path: '', loadChildren: '../home/home.module#HomeModule' },
        { path: 'settings', loadChildren: '../settings/settings.module#SettingsModule' },
        { path: 'home', redirectTo: '', pathMatch: 'full' }
    ])
],
exports: [
    RouterModule
]
})
export class AppRoutingModule {  
}

home.module.ts home.module.ts

//all necessary imports

@NgModule({
imports: [
    CommonModule,
    TranslateModule,
    FormsModule,
    RouterModule.forChild([
        {
            path: '', component: HomeComponent, canActivate: [SecureGuard]
        }
    ]),
    ViewCountPipeModule
],
declarations: [
    HomeComponent
],
providers: [
    SecureGuard,
    CommonService
]
})
export class HomeModule {
}

settings.module.ts settings.module.ts

//all the necessary imports

@NgModule({
imports: [
    CommonModule,
    TranslateModule,
    FormsModule,
    RouterModule.forChild([
        {
            path: '', component: RouteHolderComponent,
            children: [
                { path: '', redirectTo: 'settings', pathMatch: 'full' },
                { path: 'settings', component: SettingsComponent },
                { path: 'profile', loadChildren: '../profile-settings/profile-settings.module#ProfileSettingsModule' },
                { path: 'account', loadChildren: '../account-settings/account-settings.module#AccountSettingsModule' }
            ], canActivate: [SecureGuard]
        }
    ]),
    RouteHolderModule
],
declarations: [
    SettingsComponent
],
providers: [
    SecureGuard, SettingsService
]
})
export class SettingsModule {
}

RouteHolderModule exports RouteHolderComponent which just has a <router-outlet></router-outlet> tag in it. RouteHolderModule导出RouteHolderComponent ,其中只有一个<router-outlet></router-outlet>标签。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM