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