Angular 角度4:初始化服务中所有组件都要使用的数据

Angular 角度4:初始化服务中所有组件都要使用的数据,angular,Angular,我对angular和构建一个应用程序来显示不同科目的课程信息还不熟悉。我得打个休息电话才能把所有的科目都安排好。然后我想与所有控制器共享此数据 我创建了一个具有getSubjects()方法的服务。如何调用此方法来初始化subjects数据,以便所有控制器都可以使用它?我试图在app.component.ts ngOnInit()中调用此函数 但是,当我试图在我的组件中使用它时,主题最初是未定义的,稍后会更改。一旦主题数据可用,我如何处理这个未定义的对象并更新组件 简而言之,我应该在哪里初始化服

我对angular和构建一个应用程序来显示不同科目的课程信息还不熟悉。我得打个休息电话才能把所有的科目都安排好。然后我想与所有控制器共享此数据

我创建了一个具有getSubjects()方法的服务。如何调用此方法来初始化subjects数据,以便所有控制器都可以使用它?我试图在app.component.ts ngOnInit()中调用此函数

但是,当我试图在我的组件中使用它时,主题最初是未定义的,稍后会更改。一旦主题数据可用,我如何处理这个未定义的对象并更新组件

简而言之,我应该在哪里初始化服务方法中的数据,以便所有组件都可以使用它

我尝试使用APP_初始化器实现该解决方案,但它不会阻止我的应用程序并最终提供空的主题数据

我的服务具有加载功能:

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;

}

组件不应该关心数据是否被重用。从
OnInit
中的服务请求数据,就像加载组件时您希望加载的任何其他请求一样

在服务中,持久化可观察对象,并在为其赋值后返回相同的可观察对象。任何使用服务方法的组件都将在检索到相同的物化值后访问该值

private myReusedObservable: Observable<any>;
getData(): Observable<any> {
    if (!this.myReusedObservable)
        this.myReusedObservable = this.http.get<any>('urlHere');
    return this.myReusedObservable;
}
私有myReusedObservable:可观察;
getData():可观察{
如果(!this.myReusedObservable)
this.myReusedObservable=this.http.get('urlHere');
返回此.myReusedObservable;
}

注意:用您想要使用的模型定义替换
any

组件不应关心数据是否被重用。从
OnInit
中的服务请求数据,就像加载组件时您希望加载的任何其他请求一样

在服务中,持久化可观察对象,并在为其赋值后返回相同的可观察对象。任何使用服务方法的组件都将在检索到相同的物化值后访问该值

private myReusedObservable: Observable<any>;
getData(): Observable<any> {
    if (!this.myReusedObservable)
        this.myReusedObservable = this.http.get<any>('urlHere');
    return this.myReusedObservable;
}
私有myReusedObservable:可观察;
getData():可观察{
如果(!this.myReusedObservable)
this.myReusedObservable=this.http.get('urlHere');
返回此.myReusedObservable;
}
注意:用您想要使用的模型定义替换
any

此问题已在帖子中回答,您想要使用APP\u初始化器服务此问题已在帖子中回答,您想要使用APP\u初始化器服务