微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法订阅 BehaviourSubject

如何解决无法订阅 BehaviourSubject

我有一个奇怪的问题。我在一项服务中定义了一个 BehavIoUrSubject 以在用户更改语言时传播更改。在许多组件中,当 BehavIoUrSubject 发生变化时,我会做一些事情。它适用于除一个之外的所有组件,我不知道为什么。

我的代码

@Injectable()
export class I18nLanguagesService {
  private activeLang: I18NLanguage = LANGUAGES.find(ln => ln.name === 'Español');
  activeLangSubject = new BehaviorSubject<I18NLanguage>(null);

  setActiveLang(language: I18NLanguage): void {
    this.activeLang = language;
    this.activeLangSubject.next(language);
  }

  getActiveLang(): I18NLanguage {
    return this.activeLang;
  }

  getLanguages(): I18NLanguage[] {
    return LANGUAGES;
  }

}

providersCoreModule 部分中声明,在 app.module 中导入一次。

用法

组件 1(在 shared.module 中定义)

这个很好用。每次主体发出值时,它都会调用服务。

 constructor(private statesServ: StatesService,private i18nSrv: I18nLanguagesService) {}
 this.i18nSrv.activeLangSubject
      .pipe(
        tap(() => {
          this.statesMultiCtrl.reset();
          console.log('SELECTOR | In tap')
        }),switchMapTo(this.statesServ.getStatesList())
      )
      .subscribe(states => {
        this.states = states;
        this.statesFiltered = this.states;
      });

管道(在 shared.module 中定义)

它也适用于管道:

export class AsyncI18nDatePipe implements PipeTransform {
  constructor(private i18nS: I18nLanguagesService) {}

  transform(value: Date | null | undefined,format = 'mediumDate',timezone?: string): Observable<string> {
    if (value) {
      return this.i18nS.activeLangSubject.pipe(map(localeId => formatDate(value,format,localeId.countryCode,timezone)));
    }
    return of('');
  }
}

故障在此组件中,也在 shared.module 中定义:

  constructor(private formBuilder: FormBuilder,private valUsuServ: ValidationUseRSService,private cmpServ: CampaignsService,private i18nService: I18nLanguagesService) {
    this.filters = this.formBuilder.group({
      idClient: new FormControl(null),idProject: new FormControl({ value: null,disabled: true }),sourceLanguage: new FormControl({ value: null,targetLanguage: new FormControl({ value: null,rangeDate: new FormGroup({
        dateFrom: new FormControl(null),dateto: new FormControl(null),}),idItem: new FormControl({ value: null,disabled: false }),searchWords: new FormControl({ value: null,itemState: new FormControl(null),category: new FormControl({ value: null,validationUser: new FormControl({ value: null,campaing: new FormControl(null),priorityOrd: new FormControl('asc'),dateOrd: new FormControl('asc'),categoryOrd: new FormControl('asc'),campaingOrd: new FormControl('asc'),});
  }

  ngOnInit(): void {
    this.i18nService.activeLangSubject.pipe(tap(lang => console.log('FILTERS | In tap -->',lang)));`
}

当我输入有问题的组件时,它会记录所有内容

Component on init

但是当我更改语言时,只有在“有效”的组件中,它才会记录更改:

change languages and log

我不知道为什么会发生这种行为,任何帮助将不胜感激。感谢阅读!!

解决方法

在您的“失败组件”中。尝试订阅更改,例如:

this.i18nService.activeLangSubject.pipe(tap(lang => console.log('FILTERS | In tap -->',lang))).subscribe(() => console.log("changed"));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?