首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BehaviorSubject不工作角5

BehaviorSubject不工作角5
EN

Stack Overflow用户
提问于 2018-06-14 23:11:40
回答 3查看 8.5K关注 0票数 4

我好像搞不懂是什么问题,

我有一项服务有这样的行为主题..。

代码语言:javascript
复制
popupSource = new BehaviorSubject<any>('');

popup(component) {
   this.popupSource.next(component);
}

然后在我的头组件中

代码语言:javascript
复制
popupClick() {
    this._service.popup('example');    
}

然后在我的header.html里

代码语言:javascript
复制
<button (click)="popupClick()"></button>

然后在我的应用程序组件中

代码语言:javascript
复制
ngOnInit() {
    this._service.popupSource.subscribe((result) => {
       console.log(result);
    })
}

所以所发生的是点击是触发this._service.popup('example');,但它从来没有击中订阅.

我已经在每个函数上设置了断点,它成功地到达了this.popupSource.next(component),但是什么都没有??每次单击该按钮时,我都应该得到控制台日志。

我不知道我做错了什么..。为了简洁起见,我省略了代码,所以如果您需要更多信息,请告诉我。

编辑

我也试过

代码语言:javascript
复制
private popupSource = new BehaviorSubject<any>('');

getPopup = this.popupSource.asObservable();

popup(component) {
   this.popupSource.next(component);
}

而在我的应用程序组件中,列表则改为getPopup。

代码语言:javascript
复制
ngOnInit() {
    this._service.getPopup.subscribe((result) => {
       console.log(result);
    })
}

这也没用,我不知道问题出在哪里.

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-14 23:42:50

这里的问题是,您在两个不同的模块中提供服务,最终得到两个服务实例。如果使用角v6,最简单的方法是在服务中使用providedIn标志:

代码语言:javascript
复制
import { Injectable } from '@angular/core';

@Injectable({providedIn: 'root'})
class myService {}

通过这种方式,您不需要在任何模块的提供者数组中提供服务,它将自动在根注入器中提供。

有关这方面的文档可以在这里找到:角度提供者

如果您使用的是角v5,则只应在您的AppModule中提供服务。

票数 14
EN

Stack Overflow用户

发布于 2018-06-14 23:26:25

在您的服务中,编写如下新方法:

代码语言:javascript
复制
popupSource = new BehaviorSubject<any>('');

getPopupSource() { 
   return this.popupSource.asObservable();
}

而不是直接订阅主题本身。您可以在订阅'asObservable()‘部分时添加它,而不是创建一个全新的方法,但是我喜欢单独的方法,这样我就可以保持主题的私密性,而且我通常在整个应用程序的不同位置多次订阅某个内容,因此减少了重复。

在你的组成部分中:

代码语言:javascript
复制
this._service.getPopupSource().subscribe( result => { etc...})

编辑:

演示您的场景- https://stackblitz.com/edit/angular-n6esd5

票数 3
EN

Stack Overflow用户

发布于 2020-12-03 04:54:42

您可能没有相同的服务实例,我同样的问题是,我为我的服务提供了@Injectable({ providedIn: 'root'}),但是我也把这个服务放在组件提供者[]数组中,只要移除提供者数组,那么它就能工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50867132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档