我是角色新手并构建应用程序以显示不同主题的课程信息。我必须休息一下才能获得所有科目。然后我想与所有控制器共享这些数据。
我创建了一个具有getSubjects()方法的服务。如何调用此方法初始化主题数据,以便所有控制器都可以使用它?我试着在app.component.ts ngOnInit()
中调用它但是当我尝试在我的组件中使用它时,主题最初是未定义的,并且稍后会更改。如果主题数据可用,我该如何处理这个未定义的对象并更新组件?
简而言之,我应该在服务方法中初始化我的数据,以便所有组件都可以使用它?
我尝试使用APP_INITIALIZER来实现解决方案但是它不会阻止我的应用并最终提供空主题数据。
我的服务有加载功能:
subjects: Subject[] = [];
load() {
return this.getSubjects().subscribe(
subjects => this.setSubjects(subjects),
err => { console.log("something went wrong");
}
);
}
getSubjects(): Observable<Subject[]> {
return this.http.get<Subject[]>(this.Url)
.pipe(
catchError(this.handleError('getSubjects', []))
);
}
setSubjects(s: Subjects[]): void {
this.subjects = s;
}
module.ts文件有:
export function trainingProviderFactory(service: TrainingService) {
return () => service.load();
}
答案 0 :(得分:2)
组件不应该关心数据是否被重用。从OnInit
中的服务请求数据,就像加载组件时要加载的任何其他请求一样。
在服务中,持久化observable并在为其分配值后返回相同的observable。使用该服务方法的任何组件一旦被检索就会访问相同的具体化值。
private myReusedObservable: Observable<any>;
getData(): Observable<any> {
if (!this.myReusedObservable)
this.myReusedObservable = this.http.get<any>('urlHere');
return this.myReusedObservable;
}
注意:将any
替换为您要使用的模型定义。