我当前正在使用Angular 7。
我正在尝试实现基本的http服务,因此我可以处理所有错误并显示加载的gif完全相同。因此,我有一个基本服务,我所有的服务都得到扩展。发出http请求后,我会更新页面正在加载的“行为主题”。我在OpenSSL
中订阅了此libjniopenssl.so
,但从未在这里触发它。从网上看,每个人都建议我的基本http服务不是单例,而我的OpenSSL
则在订购基本服务的另一个实例。
我在SlackBlitz here上创建了一个小例子。
当您单击“更改showLoading”按钮时,我的订阅在BehaviorSubject
类中似乎工作正常,但从未在app.component中触发?
我在做什么错了?
答案 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));
?