Angular BehaviorSubject возвращает начальное значение при подписке после установки следующего значения - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующий сервис:

export class TestService {

  constructor() { }

  private _schema = new BehaviorSubject("User");
  currentSchema = this._schema.asObservable();

  setSchema(schema: string) {
    this._schema.next(schema);
  }
}

Когда я подписываюсь на наблюдаемое и меняю значение после подписки, все работает нормально, но когда я подписываюсь в другом компоненте ПОСЛЕ изменения значения, я получить начальное значение intead нового заданного значения.

Так что, когда я подписываюсь на наблюдаемое в ngOnInit() и устанавливаю следующее значение в том же компоненте, это работает. Но я хочу получить это следующее значение в другом компоненте, который создается позже.

Я использую службу следующим образом:

ngOnInit() {

    this.testService.currentSchema.subscribe(x => {
      console.log('DETAIL >> ' + x);
    });
}

Я понятия не имею, почему это происходит, так как смысл BehaviorSubjects получает значение даже после подписки.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Проблема, похоже, в самом компоненте. Я никогда не думал, что это проблема компонента, поэтому я попробовал все от создания новых сервисов, совершенно нового testapp et c.

Когда я пытался создать новый компонент для использования службы, он работал. Я не мог понять, что вызвало проблему в старом компоненте, я просто скопировал код 1 в 1 для нового компонента, но он неожиданно сработал.

0 голосов
/ 24 февраля 2020

вы можете использовать AsyncSubject вместо BehaviorSubject, как это

private _schema = new AsyncSubject();

AsyncSubject является вариантом SubSubject, в который отправляется только последнее значение выполнения Observable. его подписчики

это пример Пример

, поэтому ваш код будет

export class TestService {

  constructor() { }

  _schema = new AsyncSubject();


  setSchema(schema: string) {
    this._schema.next(schema);
  }

   getSchema(){
      return this._schema;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...