Angular 2-하위 모듈 라우팅 및 중첩 된 <라우터 콘센트>


82

아래에 설명 된 시나리오에 대한 Angular 2 솔루션을 찾고 있습니다.

여기에 이미지 설명 입력

이 시나리오에서 상단 탐색에는 하위 모듈을로드하는 링크가 포함되고 하위 탐색에는 하위 모듈의 콘텐츠를 업데이트하는 링크가 있습니다.

URL은 다음과 같이 매핑되어야합니다.

  • / home => 메인 컴포넌트 라우터 아웃렛에 홈 페이지를로드합니다.
  • / submodule => 기본 구성 요소 라우터 콘센트에 하위 모듈을로드하고 기본적으로 하위 모듈의 홈 페이지와 하위 탐색 모음을 표시해야합니다.
  • / submodule / feature => 하위 모듈의 라우터 콘센트 내부의 기능을로드합니다.

앱 모듈 (및 앱 구성 요소)에는 다른 하위 모듈로 이동하는 상단 탐색 모음이 포함되어 있으며 앱 구성 요소 템플릿은 다음과 같을 수 있습니다.

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

그러나 여기에 복잡성이 있습니다. 두 번째 수준의 탐색 모음과 자체 구성 요소를로드하기위한 자체 라우터 콘센트가있는 유사한 레이아웃을 갖는 하위 모듈이 필요합니다.

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

모든 옵션을 시도하고 모든 곳에서 검색했지만 라우터 콘센트가있는 하위 모듈에 기본 템플릿 (예 : 앱 구성 요소)을 포함하고 하위 탐색을 잃지 않고 내부 라우터 콘센트에 하위 모듈의 내용을로드하는 솔루션을 찾을 수 없었습니다. .

어떤 의견이나 아이디어라도 감사하겠습니다


그렇다면 현재 설정에서 정확히 무슨 일이 일어나고 있습니까?
micronyks

1
현재 설정으로는 내부 라우터 콘센트를 사용할 수 없습니다. 라우팅은 주 라우터 콘센트의 하위 모듈 구성 요소까지로드하며 모든 하위 모듈 구성 요소 템플릿에는 하위 탐색이 포함되어 있어야합니다
Ron F

1
하위 탐색을 잃지 않고 중첩 된 라우터 콘센트에 대한 솔루션을 찾았습니까? 나는 비슷한 문제에 착수했습니다.
Saurav

2
네, 제가 똑같은 문제를 겪었다 고 생각합니다. <sub-navbar>가 표시되지 않고 라우터 콘센트에서 나오는 것만 표시됩니다.
louisvno

각도 8 다단계 RouterOutlet 및 RouterModules 예를 들어 여기를 확인 freakyjolly.com/...
코드 스파이에게

답변:


54

html 페이지는 다음과 같습니다.

메인 페이지

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

하위 모듈 페이지

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

상단 네비게이션 바에서 네비게이션을 클릭하면 메인 루트 아웃렛이 각각 라우팅됩니다.

하위 탐색 바를 클릭하는 동안 라우터 콘센트 [sub]가 각각 라우팅됩니다.

HTML은 괜찮습니다. 트릭은 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
  }
]

도움이되기를 바랍니다.

자세한 내용은 https://angular.io/guide/router


1
네 html str이 정확했습니다. 메인 게임은 app.routing.ts와 함께 있습니다. 비슷한 응용 프로그램을 두 번 수행했습니다.
Aswin KV

1
답변 해주셔서 감사합니다. 비슷한 라우팅을 시도했지만 그 하위 모듈 라우터 콘센트가 어디로 가야합니까? 메인 모듈에서 라우터 아웃렛이 app.component의 템플릿에 있어야한다는 것이 분명하지만 서브 모듈에 대해 동일한 개념의 앱 컴포넌트가 없습니다. 그래서 "서브"라우터 콘센트는 어디로 가는가?
Ron F

또한 하위 탐색 모음의 routerLink는 어떻게 생겼습니까?
Ron F

3
라우터 링크는 문자열 시작 부분에 '/'를 추가하면 '/'를 추가하지 않으면 현재 경로를 대체합니다. 경로 링크는 현재 경로와 함께 추가됩니다. 여전히 명확하지 않다 링크 일부 온라인 코딩 플랫폼에서의 샘플 응용 프로그램을 만들고 공유하십시오
Aswin KV

2
나는 이것에 대해 완전히 확신 router-outlet하지 못하지만 중첩 된 지시문은 이름을 지정할 필요가 없습니다. 예 : github.com/gothinkster/angular-realworld-example-app/blob/…
Jess

21

사용하다:

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

전체 예 :

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
이 이름 경로가 지원되는 이후 버전입니다. Bcoz v6에서 시도하고 있는데 작동하지 않습니다.
Sujay UN

1
현재 버전의 각도에서는 작동하지 않습니다.
After_Sunset

0

이 "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"},
      ]
   },
];

이 스 니펫은 오류를 반환합니다. "Uncaught ReferenceError : LoginComponent is not defined"
Umpa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.