我只是尝试在解析器服务中使用简单的BehaviorSubject和Observable属性来模拟http调用。我不明白为什么以下内容不起作用:
schedule-administration.service.ts:
@Injectable({
providedIn: 'root'
})
export class ScheduleAdministrationService implements OnInit, Resolve<Observable<SportType[]>> {
private _sportTypesSubject = new BehaviorSubject<SportType[]>([]);
sportTypes$: Observable<SportType[]> = this._sportTypesSubject.asObservable();
constructor(private leagueAdminService: LeagueAdministrationService) {}
resolve(): Observable<SportType[]> | Observable<Observable<SportType[]>> | Promise<Observable<SportType[]>> {
this._sportTypesSubject.next([...])
return this.sportTypes$;
}
}
我认为resolve方法应该订阅返回的observable吗?当我手动执行this.sportTypes$.subscribe(v => console.log(v))
时,它会正确记录值。...
答案 0 :(得分:1)
您的构造所带来的问题是,您最初使用BehaviorSubject
。
Angular Router期望您的解析器结果在返回数据之前完成。
因此,使用BehaviorSubject
假设您一次只有一个值,但是该值始终可以更改。
要完成这项工作,我认为您只能采用第一个发出的响应/值,例如使用first
运算符:
resolve(): Observable<SportType[]> | Observable<Observable<SportType[]>> | Promise<Observable<SportType[]>> {
return this._sportTypesSubject.asObservable().pipe(first())
}
根据Angular文档
数据提供程序类可与路由器一起使用,以在导航期间解析数据。该接口定义了导航开始时将调用的resolve()方法。 然后,路由器将等待数据解析,然后才最终激活路由。