2017-09-14 4 views
3

각도 모듈을 느리게로드했으며 example.module을 호출했습니다. example.module에는 a.component와 b.component라는 두 개의 다른 구성 요소와 a와 b 두 가지 하위 구성 요소가 있습니다.각도가 느슨하게로드 된 모듈 하위 경로로 직접 이동합니다.

내가 원하는 것은 모듈이 라우터에서로드되었을 때 사용자가 부모 라우팅에서 선택한 경로를 기반으로 두 구성 요소 중 하나에 직접 라우팅 할 수 있다는 것입니다.

제가 생각할 수있는 유일한 해결 방법은 두 개의 완전히 다른 모듈을 만드는 것입니다. 각각의 모듈은 독립적으로로드되는 세 번째 공유 모듈에있는 공통 코드로 독립적으로로드됩니다. 그게 훨씬 더 많은 템플릿 코드와 내가 내 전체 응용 프로그램을 통해 생산 해야하는 파일처럼 내가 프로그래밍 방식으로 경로 중 하나를로드 lazyloaded 구성 요소에 신호 수있는 몇 가지 방법이되는 것 같습니다.

 RouterModule.forChild(
     [ 
      { 
      path: "", 
      redirectTo: "component-a" // How do I go to A or B? 
      }, 
      { 
      path: "component-a", 
      component: ComponentA 
      }, 
      { 
      path: "component-b", 
      component: ComponentB 
      }, 
     ] 

주제에 대한 도움과 지식에 감사드립니다.

편집 - 요청 된 루트 라우팅.

const appRoutes: Routes = [ 
    { 
    path: "example", 
    loadChildren: "./example.module#ExampleModule", 
    }, 
]; 

@NgModule({ 
    imports: [ 
     RouterModule.forRoot(appRoutes) 
    ], 
    exports: [ 
     RouterModule 
    ] 
}) 
export class AppRoutingModule { } 

은 쿵하는 소리 - https://embed.plnkr.co/uiLFu0EBZ00F8sLH836w/

+1

forRoot 설정은 무엇입니까? –

+0

예제 모듈을 느리게로드하는 forRoot가 포함 된 메인 앱 라우팅을 추가했습니다. – user3333134

+0

그래서'/ example'을 탐색하면 모듈이로드되고'path : '''가 적용됩니다. 다음에 무엇을 원합니 까? –

답변

1

게으른로드 된 모듈 작업이 같은 열망로드 된 모듈을 취급한다을 .forChild(routes)에서 지정한 라우트 구성이 단일 응용 프로그램 전체 구성으로 병합됩니다.

export const routes: Routes = [ 
    { path: 'crisis-a', loadChildren: 'app/crisis/crisis.module#CrisisModule' }, 
    { path: 'crisis-b', loadChildren: 'app/crisis/crisis.module#CrisisModule' } 
]; 

을하고 .forChild()

const routes: Routes = [ 
    { path: 'crisis-a', component: CrisisListComponentA }, 
    { path: 'crisis-b', component: CrisisListComponentB }, 
]; 

그래서 일단 합병에 다음과 같은 구성해야합니다 :

그래서 특정 경우에 당신은 forRoot에 정의

export const routes: Routes = [ 
    { 
    path: 'crisis-a', 
    children: [ 
     { path: 'crisis-a', component: CrisisListComponentA }, 
     { path: 'crisis-b', component: CrisisListComponentB } 
    ] 
    { 
    path: 'crisis-b', 
    children: [ 
     { path: 'crisis-a', component: CrisisListComponentA }, 
     { path: 'crisis-b', component: CrisisListComponentB } 
    ] 
    } 
]; 

을 따라서 CrisisListComponentB으로 이동하려는 경우 /crisis-b으로 전체 URL을 지정해야합니다.

/crisis-b/crisis-b 
+0

방금 ​​대답에 왔어 ... 답변도 나를 도와 줬어! 작은 개선 사항 : 라우트 : [{path : '위기 - a': 구성 요소 : CrisisListComponentA}]는 여전히 작동하고 중복을 제거합니다. 따라서 아동 위기 라우터의 기본 경로가 없어도됩니다. – Mar

1

나는 그들이 적절 모듈이 해결되면 경로에 canActivate 가드를 만들 것입니다.

RouterModule.forChild(
[ 
    { 
    path: "", 
    canActivate: [RootRouteGuard] 
    }, 
    { 
    path: "component-a", 
    component: ComponentA 
    }, 
    { 
    path: "component-b", 
    component: ComponentB 
    }, 
] 

을 그리고 가드는 다음과 같이 보일 것이다 :

업데이트 경로가되게합니다

@Injectable() 
export class RootRouteGuard implements CanActivate { 

    constructor(private router: Router) {} 

    public canActivate(route: ActivatedRouteSnapshot) { 
    if (/* Logic */) { 
     this.router.navigateByUrl('component-a'); 
    } else { 
     this.router.navigateByUrl('component-b'); 
    } 
    } 
} 
+0

그것이 작동 할 것 같습니다. 나는 더 나은 대안이 나오지 않는 한 그것을 테스트하고 대답으로 받아 들일 것입니다. 감사! – user3333134

+0

이것은 NavigateByUrl을 동일한 모듈에 호출하여 RootRouteGuard를 다시 호출하기 때문에 기본적으로 무한 루프로 내 앱을 borks하려고했을 때 가능할 수 있습니다. 실제 답은 부모에게 중첩 된 경로를 찾는 것입니다. 나는 그 문제를 복잡하게했다. 당신의 통찰력에 감사드립니다! – user3333134