Angular 4:初始化服务中的数据以供所有组件

时间:2018-01-25 20:18:21

标签: angular

我是角色新手并构建应用程序以显示不同主题的课程信息。我必须休息一下才能获得所有科目。然后我想与所有控制器共享这些数据。

我创建了一个具有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();
}

1 个答案:

答案 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替换为您要使用的模型定义。