使用subscribe in Component Angular 4中的行为主题进行更改检测

使用subscribe in Component Angular 4中的行为主题进行更改检测,angular,Angular,我一直坚持在服务层中为多个组件设置更改检测。下面我将只展示一个组件来说明订阅行为主题。我没有得到任何错误,只是没有数据显示。http请求是有效的。我只使用了双向数据绑定,但我需要在整个项目中更新多个组件的能力。我认为行为学可能是最好的选择,但我可能错了。我真的不知道/不明白我做错了什么。谢谢你的帮助 问题在getProjects()函数中。对于订阅get请求,在视图显示之前,不会调用结果或错误 @Injectable() export class ProjectService { priva

我一直坚持在服务层中为多个组件设置更改检测。下面我将只展示一个组件来说明订阅行为主题。我没有得到任何错误,只是没有数据显示。http请求是有效的。我只使用了双向数据绑定,但我需要在整个项目中更新多个组件的能力。我认为行为学可能是最好的选择,但我可能错了。我真的不知道/不明白我做错了什么。谢谢你的帮助

问题在getProjects()函数中。对于订阅get请求,在视图显示之前,不会调用结果或错误

@Injectable()
export class ProjectService {
  private projectsUrl: string = Globals.url + '/projects';

  private getProjectsSource = new BehaviorSubject<any>([]);
  getProjectsChange = this.getProjectsSource.asObservable();

  private errorSource = new BehaviorSubject<any>({});
  errorChange = this.errorSource.asObservable;

  private projects: Project[] = [];


  constructor(private http: Http) { }

  getProjects() {
    if (this.projects != null) {
      this.getProjectsSource.next(this.projects);
    }
    else {

      this.http.get(this.projectsUrl, Globals.getTokenHeaders())
        .map(function (res) {
          let data = res.json();

          if (data) {
            for (let project of data.projects) {
              this.projects.push(Project.create(project));
            }
            return this.projects;
          }
        })
        .catch((error: any) => Observable.throw(error || 'Server error'))
        .subscribe(
          result => {
            this.projects = result;
            this.getProjectsSource.next(this.projects);
          },
          error => {
            this.errorSource.next(true);
          });
    }
  }
}
编辑:
我一次获取所有项目,但更新或删除等crud操作都在缓存和服务器上更新。因此,当项目发生更新时,它需要更新作为特定可观察对象订户的每个组件,在本例中,我使用的是行为主体。

您有几个问题。如果:

if (this.projects != null){}
else {/* http request to get projects */}
您的
else
将永远不会被触发,因为
this.projects
不是
null
。您可以使用

private projects: Project[] = [];

因此,您应该将其设置为
null
,或者根本不设置它。

在您的服务中,我看不到
此.projectService.getProjectsChange
在服务中实际设置或声明为可观察的?在服务中为getProjectsChange=this.getProjectsSource.asObservable();因此,在get请求的映射中,我应该调用this.getProjectsSource.next(this.projects);然后让组件订阅更改,该更改将在每个月更新subscriber@grimlek我的解决方案不使用
getProjectsSource
;这正是我所拥有的。组件订阅了由
getProjects()
返回的可观察数据,但是如果另一个组件更新了数据,那么该更改不会被推送到需要更新的其他组件,因此我最终会得到需要重新提交/更新的陈旧数据,所以数据不会从服务器上只提取一次?组件可以添加到
项目
数组中吗?
private projects: Project[] = [];