Как обрабатывать несколько подписок на одну и ту же тему? - PullRequest
0 голосов
/ 23 января 2019

У меня есть следующий сценарий: у меня есть дочерние компоненты, Компонент A и Компонент B, которые прослушивают один и тот же Предмет из внешней службы, например:

this.externalService.outcome.subscribe((event)=>{
  event.preventDefault();
  if(event.id === "SAVE"){
    // Do something individudal...
    this.externalService.save();
  }
})

По сути, я перехватываю результат Предмет,сделайте что-то конкретное для текущего компонента, а затем вручную запустите действие сохранения.

Теперь наличие этого фрагмента кода в нескольких компонентах может привести к ошибкам и привести к ошибкам.Мне нужна эта подписка во всех моих компонентах, потому что каждый из них делает что-то индивидуальное.

Как я могу реорганизовать это так, чтобы родительский компонент / общий класс обслуживания управлял всеми подписками?Так, например, в дочерних компонентах я просто определяю метод, который должен быть сделан, а затем подписываюсь на externalService.outcome в моем родительском компоненте / общем сервисе и в основном выполняю все зарегистрированные функции?

РЕДАКТИРОВАТЬ: Дело в том,Мне также нужен контекст текущего дочернего компонента.

РЕДАКТИРОВАТЬ 2: Чтобы подвести итог, это должно быть последовательность:

Внешняя служба (библиотека) вызывает result.next () -> MyРодительский компонент, который слушает результат Тема перехватывает:

this.externalService.outcome.subscribe((event)=>{
  event.preventDefault();
  if(event.id === "SAVE"){
    //SOMEHOW ENSURE ALL CHILD COMPONENTS ARE TRIGGERED
  }
 //manually trigger save outcome
 this.externalService.save();
 });

-> Внутри подписки мне как-то нужно вызвать мои дочерние компоненты.Например, у каждого дочернего компонента есть метод «DomeSomethingBeforeSave ()».Но я не знаю своих дочерних компонентов, поэтому мне нужно определить какую-то функцию регистра, чтобы сообщить моему родительскому компоненту, какие функции следует вызывать.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете создать общий родительский сервис для внедрения как в родительский, так и в дочерний компонент для того, чтобы что-то произошло

// sharedService with external service injected
// you can take interceptor function as an param 
this.onSave=(interceptor)=>this.externalService.outcome.pipe(filter(event=>event.id === "SAVE"),
map(res=>interceptor(res))
)

В вашем родительском или дочернем компоненте вы всегда можете подключиться к этим наблюдаемым, чтобы делать то, что вы хотите

// pass in interceptor
this.sharedService.onSave(doSomethingBeforeSave).subscribe()
0 голосов
/ 23 января 2019

Изучение проблемы может быть одним из решений:

  1. Подписаться на родительский компонент и создать свойство ввода во всех дочерних компонентах для передачи данных.
  2. Тогдав событии ngOnChanges каждого дочернего компонента делайте то, что хотите.
...