以下は、私がルート上で定義した私の決意です。
@Injectable({
providedIn: 'root'
})
export class CourseDetailResover implements Resolve<Observable<[Course, (Lesson[])]>> {
constructor(private coursesService: CoursesService) { }
resolve(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<[Course, (Lesson[])]> {
return this.coursesService.findCourseByUrl(route.params['id'])
.pipe(
tap(data => console.log(data)),
switchMap(
course => this.coursesService.findLessonsForCourse(course.id)
.pipe(
tap(data => console.log(data)),
map<Lesson[], [Course, Lesson[]]>(lessons => [course, lessons]),
tap(data => console.log(data))
)
)
);
}
}
私のルートは
{
path: 'course/:id',
component: CourseDetailComponent,
resolve: {
detail:CourseDetailResover
}
}
リゾルバーが呼び出されていても、以下のコンポーネントngOnInitが実際に呼び出されることはありません。
export class CourseDetailComponent implements OnInit {
course$: Observable<Course>;
lessons$:Observable<Lesson[]>;
constructor(private route: ActivatedRoute) {}
ngOnInit(): void {
console.log('inside here');
this.course$ = this.route.data.pipe(map(data => data['detail'][0]));
this.lessons$ = this.route.data.pipe(map(data => data['detail'][1]));
}
}
ルートでトレースを有効にすると、次のことがわかります。
Router Event: ResolveStart
ただしRouter Event: ResolveEnd
、トレースログには存在しません。
ここで問題になる可能性はありますか?
observables
ここでRxJSを二重にネストしているようです-意図したものですか?Resolve
角度のインターフェースを見るとき、あなたはそれを正しく実装しています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])
);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加