Angular 2 - Định tuyến mô-đun con và <router-outlet> lồng nhau


81

Tôi đang tìm giải pháp với Angular 2 cho trường hợp được giải thích bên dưới:

nhập mô tả hình ảnh ở đây

Trong trường hợp này, top-nav chứa các liên kết để tải submodules và sub-nav có các liên kết để cập nhật nội dung của submodule.

Các URL phải ánh xạ như sau:

  • / home => tải trang chủ trong ổ cắm bộ định tuyến thành phần chính
  • / submodule => tải submodule trong ổ cắm bộ định tuyến thành phần chính và theo mặc định sẽ hiển thị trang chủ và sub navbar của submodule
  • / submodule / feature => tải tính năng bên trong ổ cắm bộ định tuyến của submodule

Mô-đun ứng dụng (và thành phần ứng dụng) chứa thanh điều hướng trên cùng để điều hướng đến các mô-đun con khác nhau và mẫu thành phần ứng dụng có thể trông như thế này

<top-navbar></top-navbar>
<router-outlet></router-outlet>

Nhưng ở đây là sự phức tạp. Tôi cần các mô-đun con của mình có bố cục tương tự với thanh điều hướng cấp hai và ổ cắm bộ định tuyến của riêng chúng để tải các thành phần của riêng chúng.

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

Tôi đã thử mọi tùy chọn và tìm kiếm ở khắp mọi nơi nhưng không thể tìm thấy giải pháp để có mẫu mặc định (như thành phần ứng dụng) trong mô-đun phụ với ổ cắm bộ định tuyến và cũng tải nội dung của mô-đun con trong ổ cắm bộ định tuyến bên trong mà không làm mất điều hướng phụ .

Tôi sẽ đánh giá cao bất kỳ đầu vào hoặc ý tưởng nào


Vậy chính xác thì điều gì đang xảy ra với thiết lập hiện tại?
micronyks

1
với thiết lập hiện tại, tôi không thể sử dụng ổ cắm bộ định tuyến bên trong. Tải định tuyến thậm chí các thành phần submodule trong ổ cắm router chính và tất cả các mẫu thành phần submodule tôi cần phải có một tiểu nav bao gồm
Ron F

1
bạn đã tìm thấy giải pháp cho cổng ra bộ định tuyến lồng nhau mà không làm mất điều hướng phụ không? Tôi đã rơi vào một vấn đề tương tự.
Saurav 14/07/17

2
Yea tôi nghĩ rằng tôi đã gặp phải vấn đề tương tự, <sub-navbar> chỉ không hiển thị, chỉ có những gì đến từ routeroutlet.
louisvno

Kiểm tra ở đây cho góc 8 đa cấp RouterOutlet và RouterModules dụ freakyjolly.com/...
Mã Spy

Câu trả lời:


54

Trang html sẽ trông như thế này.

Trang chính

<top-navbar></top-navbar>
<router-outlet></router-outlet>

Trang mô-đun phụ

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

khi nhấp vào điều hướng trong thanh điều hướng trên cùng, lối ra tuyến đường chính sẽ định tuyến tương ứng.

trong khi nhấp vào thanh điều hướng phụ, bộ định tuyến-ổ cắm [phụ] sẽ định tuyến tương ứng.

HTML ổn, mẹo sẽ xuất hiện khi viết app.routing

app.routing.ts

const appRoutes: Routes = [
  {
    path: 'login',
    component: LoginComponent
  },
  { path: 'home',
    component: homeComponent,
    children: [
      {
        path: 'module1',
        component: module1Component,
        children: [
          {
            path: 'submodule11',
            component: submodule11Component,
          },
          {
            path: '',
            redirectTo: 'submodule11',
            pathMatch: 'full'
          }
        ]
      },
      {
        path: 'module2',
        component: module2omponent,
        children: [
          {
            path: 'submodule21',
            component: submodule21Component,
          },
          {
            path: '',
            redirectTo: 'submodule21',
            pathMatch: 'full'
          }
        ]
      }
    ]
  },
  {
    path: 'about',
    component: aboutComponent
  }
]

Hy vọng nó sẽ giúp ích cho bạn.

Thêm chi tiết https://angular.io/guide/router


1
Vâng, html str của bạn đã đúng, Trò chơi chính là với app.routing.ts Tôi đã thực hiện các ứng dụng tương tự hai lần.
Aswin KV

1
Cảm ơn vì câu trả lời. Tôi đã thử định tuyến tương tự nhưng sự bối rối của tôi là cửa hàng bộ định tuyến mô-đun con đó nên đi đâu? trên mô-đun chính, rõ ràng là đầu ra bộ định tuyến phải ở trong mẫu của app.component nhưng chúng tôi không có khái niệm giống nhau về thành phần ứng dụng cho mô-đun con. vậy ổ cắm bộ định tuyến "phụ" đi đâu?
Ron F

Ngoài ra, routerLink trong sub-navbar sẽ trông như thế nào?
Ron F

3
Liên kết bộ định tuyến phải là một chuỗi nếu bạn thêm '/' vào đầu chuỗi, nó sẽ thay thế tuyến hiện tại nếu bạn không thêm '/', liên kết tuyến sẽ thêm vào tuyến hiện tại. Tuy nhiên bạn không phải là rõ ràng xin vui lòng tạo ra một ứng dụng mẫu trong một số nền tảng trực tuyến mã hóa và chia sẻ liên kết
Aswin KV

1
Tôi không hoàn toàn chắc chắn về điều này, nhưng router-outletchỉ thị lồng nhau không cần phải được đặt tên. Đây là một ví dụ: github.com/gothinkster/angular-realworld-example-app/blob/…
Jess

21

Sử dụng:

RouterModule.forChild()
...
<router-outlet name="sub"></router-outlet>
...
[routerLink]="[{ outlets: { sub: [subRouteName] } }]"

Ví dụ đầy đủ:

HTML

<div class="tabs tinyscroll">
  <button *ngFor="let tab of tabs"
  [routerLink]="[{ outlets: { sub: [tab.name] } }]"
  routerLinkActive="selected">
    <span>{{ tab.label }}</span>
  </button>
</div>

<section>
  <router-outlet name="sub"></router-outlet>
</section>

app.module.ts

imports: [
...
    RouterModule.forChild([
      {
        path: 'registers',
        component: RegistersComponent,
        children: [
          {path: 'vehicles', component: VehiclesComponent, outlet: 'sub'},
          {path: 'drivers', component: DriversComponent, outlet: 'sub'},
          {path: 'bases', component: BasesComponent, outlet: 'sub'},
          {path: 'lines', component: LinesComponent, outlet: 'sub'},
          {path: 'users', component: UsersComponent, outlet: 'sub'},
          {path: 'config', component: ConfigComponent, outlet: 'sub'},
          {path: 'companies', component: CompaniesComponent, outlet: 'sub'}
        ],
        canActivate: [AuthGuard]
      }
    ]),
...

1
Phiên bản nào trở đi tuyến đường tên này được hỗ trợ. Bcoz Tôi đang cố gắng trong v6 và nó không hoạt động.
Sujay UN

Điều này không hoạt động trong phiên bản hiện tại của angle.
After_Sunset

0

bạn phải đề cập đến tên cửa hàng trong các tuyến đề cập đến tên cửa hàng bộ định tuyến của bạn trong định tuyến như sau "outlet: 'sub"

routes: Routes = [
  {path:'', redirectTo: 'login', pathMatch: 'full'},
  {
    path: 'login',
    component: LoginComponent,

  },
  { path: 'home',
    component: AppComponent,
      children: [
        {path: 'home/pdf',component: SideMenuPage,outlet:"sub" },
        {path:'home/addFileUp',component:SidePageAdd,outlet:"sub"},
      ]
   },
];

đoạn mã này trả về lỗi: "Uncaught ReferenceError: LoginComponent không được xác định"
Umpa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.