Как я могу получить значение первой наблюдаемой в цепочке наблюдаемых отношений - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю с приложением, в котором использую шаблон угловой модели.

Чего я пытаюсь добиться, так это: добавив статью определенного типа, я хочу, чтобы произошло две вещи:

  1. загрузить газету снова (это обновит модель: модель. Газета);
  2. после того, как газета загружена, я хочу перезагрузить список статей этого определенного типа (это обновляет модель: model.ArticlesOfSomeType);

По какой-то причине у меня нет свойства списка статей в газете.

У меня есть две наблюдаемые, с которыми я работаю:

artikelAdded$: Observable<{ newspaperId: number, artikelType: string}>;    

Метод magazineService.load возвращает Observable <"Газета">. Скажем, например:

load(newspaperId):Observable<Newspaper> { 
   // observable is created from a Promise of getting the Newspaper
   // when the Promise is resolved, here the model.Newspaper is set
}

А также, «reloadArticlesOfType» установит другую часть модели:

reloadArticlesOfType(newspaperId, type) = {
     model.ArticlesOfSomeType = GetArticles(newspaperId, type);
}

То, что я пытаюсь сделать, выглядит примерно так:

this.actionCompletedService.artikelAdded$
    .pipe(
       map(artikelAdded => this.newspaperService.load(artikelAdded.NewspaperId)),
       switchMap(loadNewspaper$ => loadNewspaper$)
    )
    .subscribe(newspaper => this.newspaperService
                           .reloadArticlesOfType(newspaper.Id, artikelAdded.artikelType));

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

Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2018

Прежде всего, вы, вероятно, можете немного упростить код, удалив switchMap(loadNewspaper$ => loadNewspaper$) и используя непосредственно switchMap вместо map в качестве первого оператора.

Затем, дойдя до сути вашего вопроса, вы можете направить оператор map в результат this.newspaperService.load(artikelAdded.NewspaperId), чтобы вернуть и artikelAdded, и newspaper.

Код будет выглядеть примерно так

this.actionCompletedService.artikelAdded$
    .pipe(
       switchMap(artikelAdded => this.newspaperService.load(artikelAdded.NewspaperId)).pipe(map(newspaper => ({newspaper, artikelAdded})))
    )
    .subscribe(newspaperAndArticle => this.newspaperService
                           .reloadArticlesOfType(newspaperAndArticle.newspaper.Id, newspaperAndArticle.artikelAdded.artikelType));

Это должно сработать, поскольку вы передаете subscribe объект, который содержит newspaper и article.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...