Javascript 正在使用的Angular 2和rxjs主题未在组件上更新

Javascript 正在使用的Angular 2和rxjs主题未在组件上更新,javascript,angular,typescript,observable,subject,Javascript,Angular,Typescript,Observable,Subject,大家好,提前谢谢你们的帮助。。。 我正在构建一个应用程序,我希望有一个用于处理某些配置的服务,它由不同的模块共享。 我真的不知道这是否是最好的方法,但我从angularJS开始就使用它 配置服务 任何其他组件 因此,侧边栏组件订阅不起作用,任何人都知道我在这里做错了什么,或者我是否应该采取不同的方法 再次感谢。如果您在@NgModule中提供服务,您将获得整个应用程序的单个实例,除非您也在惰性加载模块的@Component或@NgModule中提供服务 @NgModule中提供的提供程序被提升到

大家好,提前谢谢你们的帮助。。。 我正在构建一个应用程序,我希望有一个用于处理某些配置的服务,它由不同的模块共享。 我真的不知道这是否是最好的方法,但我从angularJS开始就使用它

配置服务

任何其他组件

因此,侧边栏组件订阅不起作用,任何人都知道我在这里做错了什么,或者我是否应该采取不同的方法


再次感谢。

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

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

延迟加载的模块有自己的根作用域,它是应用程序根注入器的子注入器

我假设您的问题是由在非延迟加载和延迟加载模块中提供服务引起的,这将导致两个实例

注入此模块的组件或服务从应用程序根获取实例(如果它们是非延迟加载模块的一部分),或者从延迟加载模块获取实例(如果它们是延迟加载模块的一部分)

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

您在哪里提供ConfigService?每个模块中都提供ConfigService。在本例中,我有一个模块,其中有一个侧边栏组件和一个延迟加载的模块,该模块与试图压缩侧边栏的组件一起调用。两个模块都提供了ConfigService。。。我在app.module中也提供了它。。。
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);
}