gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:01 24 4
gpt4 key购买 nike

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

所以,Sidebar 组件订阅不起作用,任何人都知道我在这里做错了什么,或者我是否应该采取不同的方法!?

再次感谢。

最佳答案

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

@NgModule() 中提供的提供程序被提升到应用程序根注入(inject)器中,其中模块的导入顺序很重要,并且稍后在 imports: [] 中列出的模块会覆盖之前的如果提供者 key 匹配,则为模块提供者。在 AppModule@NgModule() 中添加的提供者直接覆盖导入模块的提供者。

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

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

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

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

关于javascript - 服务中的 Angular 2 和 rxjs 主题未在组件上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42315510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com