2016-09-28 40 views
13

我有一個Angular 2.0(穩定版本)應用程序,其中一個實體是project。對於這些projects的,我有它的詳細信息傳播翻過不同的部分/路線:Angular 2 - 爲父母和小孩路線使用相同的解析器

  • project/:id/overview
  • project/:id/documents
  • project/:id/logs

project回報的API大部分數據在一次調用中,所以我需要調用一次,並使其可用於不同的子路由。

我的路線是這樣的:

export const routing: ModuleWithProviders = RouterModule.forChild([ 
    { path: 'projects',     component: ProjectsComponent }, 
    { path: 'project/new',    component: NewProjectComponent }, 
    { 
     path: 'project/:id', 
     component: ProjectDetailComponent, 
     resolve: { 
      project: ProjectDetailResolve 
     }, 
     children: [ 
      { path: '', redirectTo: 'overview', pathMatch: 'full' }, 
      { path: 'overview',   component: ProjectOverviewComponent }, 
      { path: 'documents',   component: DocumentsComponent }, 
      { path: 'logs',    component: LogsComponent }, 
     ] 
    } 
]); 

ProjectDetailComponent目前通過獲取項目數據成功,與解析器(沒有問題存在):

ngOnInit() { 
    this.route.data.forEach((data: { project: any }) => { 
     this.project = data.project; 
    }); 
} 

但我需要傳遞的是同一個項目直到子路由,因爲爲每個路由觸發另一個API調用沒有意義。

我已經嘗試在子組件中使用相同的ngOnInit代碼,認爲也許Angular Router也會傳遞路由數據,但沒有成功。

有什麼想法嗎?

感謝

回答

16

您可以使用「路線」父'屬性來獲取從父解析器的數據。

ngOnInit() { 
    this.route.parent.data.subscribe(data => { 
     this.project = data.project; 
    }); 
} 
+0

謝謝,完美的作品! – yorch

+0

在當前版本中也可以這樣做:''this.route.parent.snapshot.data ['mydata']''如果我想要同步訪問嗎? – Matt

4

依靠多遠是在組件層次結構的決心對象,你可以通過parent財產達到它。

例子:

ngOnInit() { 
    this.route.parent.data.subscribe(data => this.project = data.project); 
} 

或者不認購

ngOnInit() { 
    this.project = this.route.snapshot.parent.data['project']; 
} 

附: 請記住,如果您的組件比一個級別更深,可以將parent屬性鏈接無限次。像this.route.snapshot.parent.parent.data['project']一樣。乾杯!