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