在基类中订阅行为主题时,Rxjs订阅不起作用

时间:2019-01-03 10:14:59

标签: angular rxjs

我当前正在使用Angular 7。

我正在尝试实现基本的http服务,因此我可以处理所有错误并显示加载的gif完全相同。因此,我有一个基本服务,我所有的服务都得到扩展。发出http请求后,我会更新页面正在加载的“行为主题”。我在OpenSSL中订阅了此libjniopenssl.so,但从未在这里触发它。从网上看,每个人都建议我的基本http服务不是单例,而我的OpenSSL则在订购基本服务的另一个实例。

我在SlackBlitz here上创建了一个小例子。

当您单击“更改showLoading”按钮时,我的订阅在BehaviorSubject类中似乎工作正常,但从未在app.component中触发?

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

与单例无关,但是关于不同实例的建议是正确的,我将尝试逐步解释。

您在app.component.ts构造函数中注入的这两个实例(BaseServiceService,FileServiceService)是不同的,并且是独立初始化的,这就是this.fileService.callBase();的原因。不会交互/触发this.baseService.showLoading BehaviourSubject,如果您将this.baseService.showLoading.subscribe(x => console.log('new val: ' + x));的这一行更改为this.fileService.showLoading.subscribe(x => console.log('new val: ' + x));,它将按预期运行,现在您只需从构造函数和BaseServiceService中删除private baseService: BaseServiceService注入即可providers: [FileServiceService, BaseServiceService]

----编辑----

我想我明白了您的打算,所以我修改了您的演示。这是链接https://stackblitz.com/edit/angular-r2wv24

答案 1 :(得分:0)

您的FileService类扩展了BaseService类,这意味着这两个类都将具有属性showLoading

仅通过FileService方法调用您的callBase()服务,这意味着只有showLoading的{​​{1}}属性会收到任何更改的通知。

我在您的FileService中更改了此行,以订阅app.component.ts而不是FileService,它按预期工作。

BaseService

我假设您想要一种抽象服务来在更高级别上定义您的this.fileService.showLoading.subscribe(x => console.log('new val app: ' + x));