Похоже, вы двойное вложение RxJS observables
здесь - это то, что задумано?Когда вы смотрите на Resolve
интерфейс angular, вы правильно его реализуете, но ваш T
на самом деле сам по себе Observable
:
export interface Resolve<T> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> | Promise<T> | T;
}
Так что ваш класс распознавателя должен выглядеть примерно так:
export class CourseDetailResover implements Resolve<[Course, (Lesson[])]>
Тот факт, что ваш ngOnInit
никогда не вызывается, приводит к предположению, что Observable
, возвращаемый вашим методом resolve
, никогда не завершается / завершается.Обратите внимание, что Observable должен завершиться, чтобы распознаватель «завершил» свою работу и продолжил процесс маршрутизации.Посмотрите эту проблему для справки:
https://github.com/angular/angular/issues/10556
Следующий код будет работать
@Injectable({
providedIn: 'root'
})
export class CourseDetailResover implements Resolve<Promise<Observable<[Course, (Lesson[])]>>> {
constructor(private coursesService: CoursesService) { }
resolve(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Promise<Observable<[Course, (Lesson[])]>> {
const routerObservable = this.coursesService.findCourseByUrl(route.params['id'])
.pipe(
switchMap(
course => this.coursesService.findLessonsForCourse(course.id)
.pipe(
map<Lesson[], [Course, Lesson[]]>(lessons => [course, lessons]),
)
)
);
return new Promise((resolve,reject) => {
routerObservable.pipe(
first()
).subscribe((data) => {
console.log(data)
resolve(routerObservable)});
})
}
}
На стороне компонента
ngOnInit(): void {
console.log('inside here');
const observableD:Observable<[Course, (Lesson[])]> = this.route.snapshot.data["detail"];
this.course$ = observableD.pipe(
map(data => data[0])
);
this.lessons$ = observableD.pipe(
map(data => data[1])
);
}