【发布时间】:2020-06-11 02:11:31
【问题描述】:
我已经声明了一个服务中的主题,并尝试通过使用“subject.next()”对后端进行 GET 调用来推送响应。还使用“subject.asObservable()”为该主题分配了一个可观察对象并订阅了两个不同组件(父级和路由器出口子级)中的 observable。问题是 observable 只为一个订阅者而不是为两个订阅者发出新值。
服务
subject = new Subject<any>();
observable = this.subject.asObservable();
public getDetails(id) {
return this.http.get(this.url.concat(id))
.pipe(map(data => this.extractDetails(data),
catchError(err => this.handleError(err)));
}
public extractDetails(data){
this.subject.next(data);
return data;
}
父组件
ngOnInIt(){
this.hitUrl();
}
getDetails(){
this.service.observable.subscribe(
(data: any) => {
console.log(data);
},
err => {
console.error(err);
}
)
}
hitUrl(id: string) {
this.service.getDetails(id).subscribe(
(data: any) =>
if(!!data){
console.log(data);
this.getDetails();
}
},
err => {
console.log(err);
}
);
}
路由器插座子组件
ngOnInIt(){
this.hitUrl();
}
getDetails(){
this.service.observable.subscribe(
(data: any) => {
console.log(data);
},
err => {
console.error(err);
}
)
}
hitUrl(id: string) {
this.service.getDetails(id).subscribe(
(data: any) =>
if(!!data){
console.log(data);
this.getDetails();
}
},ngOnInIt(){
this.hitUrl();
}
getDetails(){
this.service.observable.subscribe(
(data: any) => {
console.log(data);
},
err => {
console.error(err);
}
)
}
hitUrl(id: string) {
this.service.getDetails(id).subscribe(
(data: any) =>
if(!!data){
console.log(data);
this.getDetails();
}
},
err => {
console.log(err);
}
);
}
err => {
console.log(err);
}
);
}
在组件中,hitUrl() 也会在执行调用操作时触发,然后我需要 observable 向两个订阅者发出最新数据(如果调用操作是从父级或路由器出口子级执行的)。
【问题讨论】:
-
为什么在你的案例中还需要一个主题?您可以在两个组件中直接订阅 http 请求。
-
两个行动号召都在一个页面中(网页视图)..如果其中一个被调用,那么另一个也应该得到更新(“关注”应该更改为“关注”)..跨度>
-
在每个 ngOnInits 中放置
getDetails()调用。这就是你的组件订阅 observables 的方式 -
尝试使用 'tap' 方法而不是服务中的地图。当我们想要更改数据时,我们使用地图。
-
在两个组件 ngOnInits 中调用 getDetails()...
标签: angular typescript rxjs rxjs-observables