我想保持我的组件总量随着它的变化而更新,我想知道这是对的:
我有一个shared.service.ts
注入我的组件所以它看起来像这样(我的共享服务):
shared.service.ts
private sumEmit= new BehaviorSubject<number>(0);
public updateValues() {
this.sum= 0;
this.sum+= +(price*quant).toFixed(2);
this.sumEmit.next(this.sum);
}
获取总金额的方法:
getTotal(): BehaviorSubject<number> {
return this.sumEmit;
}
所以,每次调用updateValues()
方法时,它都会发出sum值,那是对的吗?
在每次更改值时需要检索值的组件中,我执行了以下操作:
mycomponent.component.ts
首先我注入共享服务,之后在ngOnInit
生命周期hool我写道:
// simple variable to hold value from service
total : number;
ngOnInit()
{
this.total = this.SharedService.getTotal();
}
这是否意味着每次总金额变更时我的价值都是最新的?
对我来说最令人困惑的部分是我在ngOnInit
中只调用了一次这个方法,这个方法在打开组件时呈现,但值仍然保持更新。有人可以解释一下吗?我的组件中的变量如何在服务中更改值时知道?哪个部分对此负责?
谢谢
我的组件中的变量如何在服务中更改值时知道?
您正在使用BehaviourSubject,这意味着新订阅者将始终获得同步发出的最后一个值。
哪个部分对此负责?
this.sumEmit.next(this.sum);
所以,每次调用
updateValues()
方法时,它都会发出sum值,那是对的吗?
恩,那就对了。
这是否意味着每次总金额变更时我的价值都是最新的?
是。
我的组件中的变量如何在服务中更改值时知道?
因为BehaviorSubject
从Subject
延伸,从Observable
延伸(并实施SubscriptionLike
)。 Observable的工作方式是每次发布者将新值设置为变量时(在本例中为this.sumEmit.next(this.sum)
),所有订阅者都会收到新值的通知。
你可以在Angular-Observables和ReactiveX-Observable上阅读更多相关信息
哪个部分对此负责?
这个
this.sumEmit.next(this.sum);
补充说明
.subscribe
,它为什么会起作用?因为value
属性可以随时访问,BehaviorSubject
s的独特特征(见此discussion)。这与Subject
或Observable
不同,只有在订阅他们的流时,才会开始获取值。
我们可以使用getValue
方法访问该值,即:let theValue = this.SharedService.getTotal().getValue()
。此外,如果我们将BehaviorSubject
分配给变量(让我们称之为val
)并使用此变量,即使用async
管道,该管道将自动提取该值,您将看到UI自动更新,无需订阅流(管道为你做这个)。例如:
// component.ts
this.val = this.SharedService.getTotal(); // val is a `BehaviorSubject`
// component.html
{{ val | async }}
BehaviorSubject
更改为Observable
吗?您无需更改为Observable即可进行订阅。您也可以订阅BehaviorSubject
,就像使用Observable
一样。如果您想将BehaviorSubject
作为Observable
,您只需要这样做:const myObservable: Observable = myBehaviorSubject.asObservable();
BehaviorSubject
或Observable
?我们不能说一个比另一个好,它们在某些方面表现不同。您需要根据具体情况申请其中一个。通常,BehaviorSubjects可用于表示“随时间变化的值”。例如,生日的事件流是主题,但是人的年龄流将是BehaviorSubject(请参阅RxJS-Overview的BehaviorSubject部分)。
进一步阅读