了解Angular Shared服务

问题描述 投票:1回答:2

我想保持我的组件总量随着它的变化而更新,我想知道这是对的:

我有一个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中只调用了一次这个方法,这个方法在打开组件时呈现,但值仍然保持更新。有人可以解释一下吗?我的组件中的变量如何在服务中更改值时知道?哪个部分对此负责?

谢谢

angular service components observable behaviorsubject
2个回答
1
投票

我的组件中的变量如何在服务中更改值时知道?

您正在使用BehaviourSubject,这意味着新订阅者将始终获得同步发出的最后一个值。

哪个部分对此负责?

this.sumEmit.next(this.sum);


0
投票

所以,每次调用updateValues()方法时,它都会发出sum值,那是对的吗?

恩,那就对了。

这是否意味着每次总金额变更时我的价值都是最新的?

是。

我的组件中的变量如何在服务中更改值时知道?

因为BehaviorSubjectSubject延伸,从Observable延伸(并实施SubscriptionLike)。 Observable的工作方式是每次发布者将新值设置为变量时(在本例中为this.sumEmit.next(this.sum)),所有订阅者都会收到新值的通知。

你可以在Angular-ObservablesReactiveX-Observable上阅读更多相关信息

哪个部分对此负责?

这个

this.sumEmit.next(this.sum);

补充说明

  • 如果我们不使用.subscribe,它为什么会起作用?

因为value属性可以随时访问,BehaviorSubjects的独特特征(见此discussion)。这与SubjectObservable不同,只有在订阅他们的流时,才会开始获取值。

我们可以使用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();

  • 哪一个更好:BehaviorSubjectObservable

我们不能说一个比另一个好,它们在某些方面表现不同。您需要根据具体情况申请其中一个。通常,BehaviorSubjects可用于表示“随时间变化的值”。例如,生日的事件流是主题,但是人的年龄流将是BehaviorSubject(请参阅RxJS-Overview的BehaviorSubject部分)。

进一步阅读

© www.soinside.com 2019 - 2024. All rights reserved.