【发布时间】:2017-11-26 20:34:32
【问题描述】:
我正在使用 Rxjs 可观察角度组件并学习东西。我有一个场景,我需要根据某些事件将数据从组件传递到服务。
Price.service.ts
export class PriceService{
private priceUpdate: BehaviorSubject<Object> = new BehaviorSubject({});
private oldPriceUpdate: BehaviorSubject<Object> = new BehaviorSubject({});
getPriceUpdate(){
return this.priceUpdate.asObservable();
}
getOldPrice(){
return this.oldPriceUpdate.asObservable();
}
}
以上服务用于组件中获取价格更新。
Price.component.ts
@Component({
selector: 'price',
templateUrl: 'price.component.html',
styleUrls: ['price.component.css']
})
export class PriceComponent{
updateIndicator: BehaviorSubject<Object> = new BehaviorSubject({});
constructor(private priceService:PriceService, private techIndicator:TechnicalIndicatorService){
this.techIndicator.subscribeUpdateIndicator(this.updateIndicator.asObservable());
this.priceService.getPriceUpdate().subscribe(
(newPrice:any) => {
this.updatePrice(newPrice);
}
)
this.priceService.getOldPriceUpdate().subscribe(
(oldPrice:any ) => {
//some business logic
this.updateIndicator.next({{data: data, ....});
});
}
private updatePrice(newPrice:any){
//.... some business logic....
this.updateIndicator.next({data: data, ....});
}
}
在从 PriceService 获得组件的新价格后,我有另一项服务,我正在做一些技术研究。我需要将数据传递给服务,为此我使用组件中的行为主题并且服务正在订阅它。 (与组件订阅的通常方法不同。)
如果它是使用 observable 的有效方式,请告诉我。
TechnicalIndicator.service.ts
export class TechnicalIndicatorService{
subscribeUpdateIndicator(updateIndicator:Observable<Object>){
updateIndicator.subscribe(
(obj:any) => {
// some logic
});
}
}
但是,订阅仅在 TechnicalIndicatorService 中有效。对于之后的任何数据更新,它都不会触发订阅。 请让我知道我在这里缺少什么。
【问题讨论】:
-
你为什么要传递一个 observable 给你的服务。为什么不每次需要更新指标时直接调用服务的方法呢?一个组件通常有几个实例。每次创建 TradeComponent 时,它都会创建一个新的 observable 并将其传递给服务。
-
能否包含组件的
@Component注解? -
请查看编辑后的代码。我的组件类中有 2 个订阅,priceUpdate 和 oldPriceUpdate。两者都会将数据传递给服务,并且在服务中数据必须同步(因为我正在使用它来更新我的数组)。在某些情况下,事情并没有按预期工作。因此,与其直接调用方法,不如考虑使用可观察对象并传递数据。
-
@echonax 我已在我的实际代码中添加。这里我没有添加以减少代码长度。
-
@AnuPai 所以你的组件上面没有
@Component注释?喜欢:angular.io/tutorial/toh-pt1#the-road-youve-travelled
标签: angular rxjs observable behaviorsubject