Angular 2 服务中的 rxjs 主题未在组件上更新

Angular 2 and rxjs subject in service isn't being update on component

大家好,提前感谢您的帮助... 我正在构建一个应用程序,我想要一个用于处理某些配置并由不同模块共享的服务。 我真的不知道这是否是最好的方法,但我从 angularJS.

开始使用它

配置服务

sidebarCompress: Subject<boolean> = new Subject<boolean>();
public sidebarCompressed: Observable<boolean> = this.sidebarCompress.asObservable();

constructor() {}

compressSidebar(val: boolean = false) {
    this.sidebarCompress.next(val);
    // this is firing when used
    console.log('changed on service');
}

边栏组件

constructor(
    private conf: ConfigService,
) {
    conf.sidebarCompressed.subscribe(
        sidebarCompressed => {
            // this is not firing
            console.log('changed on sidebar component');
    });
}

任何其他组件

constructor(
    private conf: ConfigService,
) { }

ngOnInit() {
    // The idea is to use it in a fn (not always on init)
    this.conf.compressSidebar(true);
}

所以,补充工具栏组件订阅不起作用,有人知道我在这里做错了什么,或者我是否应该采取不同的方法!?

再次感谢。

如果您在 @NgModule() 中提供服务,您将获得整个应用程序的单个实例,除非您也在 @Component()@NgModule() 中提供它加载模块。

@NgModule() 中提供的提供程序被提升到应用程序根注入器中,其中模块的导入顺序很重要,如果提供程序密钥匹配,imports: [] 中稍后列出的模块将覆盖以前的模块提供程序。 AppModules @NgModule() 中添加的提供程序直接覆盖导入模块的提供程序。

延迟加载的模块有自己的 "root scope",它是应用程序根注入器的子注入器。

我假设您的问题是由于在 non-lazy-loaded 延迟加载模块中提供服务引起的,这导致了 2 个实例。

注入此模块的组件或服务要么从应用程序根目录获取实例,如果它们是 non-lazy-loaded 模块的一部分,要么从延迟加载模块获取实例(如果它们是延迟加载模块的一部分) .

作为解决方案,从惰性加载模块中删除提供程序。 您还可以在 AppModule 中实现 forRoot() 和导入 MyLazyLoadedModule.forRoot() 以将延迟加载模块的服务获取到应用程序根注入器中并避免重复的服务实例。