Javascript 行为主体不工作5

Javascript 行为主体不工作5,javascript,angular,typescript,behaviorsubject,Javascript,Angular,Typescript,Behaviorsubject,我似乎不知道问题出在哪里 我有一个服务,有这样一个行为主题 popupSource = new BehaviorSubject<any>(''); popup(component) { this.popupSource.next(component); } 然后在my header.html中 <button (click)="popupClick()"></button> 所以发生的是点击触发了this.\u service.popup('exa

我似乎不知道问题出在哪里

我有一个服务,有这样一个行为主题

popupSource = new BehaviorSubject<any>('');

popup(component) {
   this.popupSource.next(component);
}
然后在my header.html中

<button (click)="popupClick()"></button>
所以发生的是点击触发了
this.\u service.popup('example')但它从未影响订阅

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

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

编辑

我也试过这样做

private popupSource = new BehaviorSubject<any>('');

getPopup = this.popupSource.asObservable();

popup(component) {
   this.popupSource.next(component);
}
这也不起作用,我不知道问题出在哪里


感谢

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

popupSource = new BehaviorSubject<any>('');

getPopupSource() { 
   return this.popupSource.asObservable();
}
编辑:


演示场景的重新创建-

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

import { Injectable } from '@angular/core';

@Injectable({providedIn: 'root'})
class myService {}
通过这种方式,您不需要在任何模块的提供者阵列中提供服务,它将自动在根注入器中提供

有关此的文档可在此处找到:


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

您可能没有相同的服务实例,我的问题是我的服务有
@Injectable({providedIn:'root'})
,但我也将此服务放在组件提供程序[]数组中,只需删除提供程序数组,然后它就工作了

您确定您拥有相同的服务实例吗?你在哪里提供它?我有两个独立的模块一个主模块和一个应用程序模块,app组件在appModule中,header组件在main模块中,但我在两个模块中都提供了服务,还是应该在appModule中导出服务,然后在main模块中从那里获取服务??您不应该在两个不同的模块中提供服务。它为每个模块创建了一个实例,这就是它不工作的原因。@GeoSpautome那么我应该如何提供它呢???@GeoSpautome我把它从mainModule的提供者列表中删除了,但它仍然不工作。。奇怪。。。我制作了一个演示,重新创建了您的示例,它的工作原理与我预期的一样。更多的代码可能会有所帮助这就是为什么这么奇怪,除了这一个,我实际上在该服务中还有20个其他功能可以工作。@geoautomine似乎在想它是如何提供的。。因为它在我的mainModule和appModule中提供了两次。。。但是我已经从主模块中删除了它,但它似乎仍然不起作用。当我阅读他们的解释时,我认为这可能也是问题所在——一般来说,如果你想在整个应用程序中提供相同的服务实例,你应该将其提供给最底层的模块(在你的应用程序模块中)。如果这不起作用,那么就把我当成你的困惑吧,我不知道是否有一个真正令人信服的理由,我只是喜欢知道一个主题只能从服务本身来控制。当我的应用程序变得越来越大,我再也记不起脑子里的每一个代码时,我就可以更容易地调试和推理。typescript中的Private实际上只是“有点私密”,所以它可能只是个人偏好我使用angular 5,我已经将该服务从我的主模块中取出,但它似乎仍然不起作用,所以我删除了该服务的每个实例并重新设置,现在它正在工作,谢谢!没问题,很乐意帮忙!贵族此外,您不能将其放在其他模块的提供程序[]中。
ngOnInit() {
    this._service.getPopup.subscribe((result) => {
       console.log(result);
    })
}
popupSource = new BehaviorSubject<any>('');

getPopupSource() { 
   return this.popupSource.asObservable();
}
this._service.getPopupSource().subscribe( result => { etc...})
import { Injectable } from '@angular/core';

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