2017-01-18 7 views
1

ngOninit компонента получает удар до того, как служба getReport возвращает данные. Это не дожидается разрешения службы.Угловые 2 компоненты загружаются до того, как маршрут будет разрешен.

маршрутизации:

@Injectable() 
class ReportResolver implements Resolve<any> { 
constructor(private reportsService: ReportsService) { 
} 
resolve(
    route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
): any { 
    this.reportsService.GetReport(route.params["id"]).subscribe((data: any) => { 
     return data; 
    }); 
}} 

const appRoutes: Routes = [ 
{ 
    path: "reports/:id", 
    component: TabularReportsFachadeComponent, 
    resolve: { report: ReportResolver } 
}, 
{ 
    path: "", 
    component: DashboardComponent 
},]; 

обслуживание:

GetReport(id: any): Observable<any> { 
    return this._http.get("api/reports/?" + id).map(res => res.json()); 
} 

компонент:

ngOnInit(): void { 
    debugger 
    this.report = this.route.snapshot.data["report"].data; 

} 

компоненты ngOninit становится хит до getReport

ответ

1

resolve должен вернуть Observable, а не Subscription. На самом деле ваш resolve ничего не возвращает, но вы не должны звонить subscribe() на Observable, потому что он возвращает Subscription.

Если вам нужно обработать значение перед возвратом, вместо этого используйте map((val) => ...) или какой-либо другой оператор.

resolve(
    route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
): any { 
    return this.reportsService.GetReport(route.params["id"]) 
}} 
+0

Я удалил подписку, и это сработало. Благодаря! – janIreal23

+0

Рад слышать :) Спасибо за отзыв. –