【问题标题】:behavior subject doesnt udate行为主体不更新
【发布时间】:2021-11-09 18:30:38
【问题描述】:

我正在尝试使用 LanguageService 中的默认值在 BahaviorSubject 中设置我的语言。我的服务看起来像这样

import {Injectable} from '@angular/core';
import * as globals from '../../../environments/globals';
import {BehaviorSubject} from 'rxjs';

@Injectable()
export class LanguageService {
    languages = globals.languages;

    language = new BehaviorSubject<string>(this.languages.polish.code);

    setLanguage(code: string) {
        console.log(code)
        this.language.next(code);
    }

    getLanguage() {
        return this.language.asObservable();
    }
}

它由 SharedModule 提供,然后由我拥有的每个组件导入。 问题是使用 setlangueage 我可以看到正确的代码 Im 设置,但 getLanguage 总是返回 mi 默认值。我以前从未遇到过 BehaviorSubject 问题,所以我不确定可能是什么原因。

我已经实现了

this.languageSubscription = this.languageService.getLanguage().subscribe((language: string) => {
            console.log(language);
        })

在我的一个组件中查看它是否正常,但是......它不是。有什么线索吗?

我认为问题与路由有关,当我更改为 AsyncSubject od normal Subject 然后在更改屏幕时,我在 getLanguage() 中什么也没有,就像它从未被调用过一样

【问题讨论】:

  • @Injectable() 你的LanguageService 是单身人士吗?
  • 我希望它是,因为它是整个应用程序的一项服务

标签: angular typescript rxjs


【解决方案1】:

从任何providers 数组中删除服务并将装饰器更改为:

@Injectable({providedIn: 'root'})

【讨论】:

  • 不明白为什么,但它帮助了谢谢!
  • 您要么意外地在某个地方有一个重复的提供程序,要么您正在使用延迟加载,它重新创建了在模块级别提供的服务。如果您的服务应该是单例,则建议使用根级别提供程序来避免其中任何一种。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2015-02-18
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多