Angular Observable - несколько подписок не фиксируются - PullRequest
0 голосов
/ 22 мая 2018

У меня очень простой сценарий с полем ввода и множеством разделов, которые выполняют вызовы API на основе того, что введено в это поле ввода.

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

Затем в моем другомРазделы пользовательского интерфейса Я подписываюсь на это поведениеSubject и хочу в любое время проверять измененное значение при выполнении вызовов API.Обратите внимание, что конечные точки API различны для каждого раздела, но их нужно запускать одновременно.

Однако я не могу заставить это работать.Вот что у меня есть

Код в моей службе changeService.ts:

valueChangedSubject: BehaviorSubject<any>: new BehaviorSubject({});
constructor() {}
valueHasChanged(updatedValue: any) {
  this.valueChangedSubject.next(updatedValue);
}

Код в одном компоненте, который вызывает событие:

valueChanged(changedVal: string) {
  this.changeService.valueHasChanged({val: changedval});
}

Код вкомпонент, который подписывается на поведение Subject:

this.changeService.valueChangedSubject.subscribe((val:any) => {
   console.log('OK I am here ', val);
});

Проблема заключается в том, что 'Ok I are here' печатается впервые при обновлении, но там, через какое-то время я вызываю метод valueChanged (), он невызвать наблюдаемое.

Я знаю, что мне здесь не хватает чего-то связанного с «горячей наблюдаемой».Но что и как это сделать?Я пытался использовать share () или publish (), но не смог заставить его работать так, как ожидал.

1 Ответ

0 голосов
/ 22 мая 2018

Поведенческий объект - горячая наблюдаемая.Горячие означает, что даже когда есть подписчики, наблюдаемые запускают новые значения.Я не вижу проблем с вашим кодом, который вы указали в своем вопросе.Выглядит хорошо.

Вы уверены, что ваш valueChangesSubject не завершится в любое время?Например, субъект завершится, когда обработает ошибку.

Вы можете проверить, завершается ли ваш Observable, используя обратный вызов onCompleted в подписке.

this.changeService.valueChangedSubject.subscribe(
  next => console.log('OK I am here ', next),
  error => console.error('Error. Observable completes', error),
  () => console.log('Observable completes. No more values will be submitted')
 );
...