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

Angular 在基类中订阅行为主题时Rxjs subscribe不起作用,angular,rxjs,Angular,Rxjs,我目前正在使用Angular 7 我正在尝试实现一个基本的http服务,这样我就可以处理每个错误,并显示加载GIF的情况完全相同。因此,我有一个基本的服务,我的所有服务扩展;一旦发出http请求,我就会更新页面正在加载的行为主题。我在我的app.component.ts中订阅了这个BehaviorSubject,但在这里它从未被触发。从网上看,每个人都认为我的基本http服务不是单一的,我的app.component.ts订阅的是基本服务的不同实例 我创建了一个关于SlackBlitz的小例子

我目前正在使用Angular 7

我正在尝试实现一个基本的http服务,这样我就可以处理每个错误,并显示加载GIF的情况完全相同。因此,我有一个基本的服务,我的所有服务扩展;一旦发出http请求,我就会更新页面正在加载的行为主题。我在我的
app.component.ts
中订阅了这个
BehaviorSubject
,但在这里它从未被触发。从网上看,每个人都认为我的基本http服务不是单一的,我的
app.component.ts
订阅的是基本服务的不同实例

我创建了一个关于SlackBlitz的小例子

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


我做错了什么?

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

只有
FileService
服务通过
callBase()
方法调用,这意味着只有
showLoading
属性会从
FileService
通知任何更改

我在您的
app.component.ts
中更改了这一行,以订阅
FileService
,而不是
BaseService
,并且它按预期工作

this.fileService.showLoading.subscribe(x => console.log('new val app: ' + x));

我假设您想要一种抽象服务来定义更高级别的
showLoading

这与singleton无关,但是关于不同实例的建议是正确的,我将尝试一步一步地解释

您在app.component.ts构造函数中注入的这两个实例(BaseServiceService、FileServiceService)是不同的,并且是独立初始化的,这就是为什么这个.fileService.callBase();如果更改
this.baseService.showLoading.subscribe(x=>console.log('new val:'+x)),则不会交互/触发this.baseService.showLoading行为主题这一行带有
this.fileService.showLoading.subscribe(x=>console.log('new val:'+x))它将如您所期望的那样工作,现在您只需从构造函数中移除
私有baseService:BaseServiceService
注入,并从
提供者中移除BaseServiceService:[FileServiceService,BaseServiceService]

----编辑----


我想我明白你的意图,所以我修改了你的演示。这里是link

是的,我确实想要更高级别的抽象服务。我当前的场景如何实现这一点?我想不扩展
BaseService
将是第一步,然后让您的
FileService
订阅您的
BaseService
内部可观察?有多种方法可以满足您的需求,但如果没有大局观,很难根据模拟示例提出解决方案……很好的解释,我理解,但我希望使用基本服务,因为这是其他所有服务都将使用的。我不想订阅我的app.component.ts中每个服务上的每个showLoading属性,而只是一个基本服务。您想要实现的是使用http拦截器轻松完成。我建议您不要继承基本服务,而是在其他服务中使用/注入基本服务。这样,您就可以在所有其他服务中访问基本服务的功能,并且仍然只使用一个可以在组件中订阅的基本服务实例。@Davy非常好的建议,这就是我最后采用的路线。虽然现在我有2个http拦截器(另一个是jwt令牌拦截器)。拥有两个http拦截器是一种不好的做法吗?不是。一点也不。让一个拦截器做多个不相关的事情是不好的做法。