Angular7 RXJS @ ngrx / Effects выбирает пользователя при изменении маршрута - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь включить следующие функции в среде Angular7, @ ngrx / Effects:

В URL есть идентификатор пользователя, и я хотел бы выбрать пользователя из массива пользователей, полученного с сервера (/api/users конечная точка). Я хотел бы сделать вызов API с userService.getUsers, и после его завершения я бы хотел выбрать пользователя из массива пользователей, полученного с сервера, с идентификатором пользователя, присутствующим в URL.

Пока что у меня есть это, но оно не отправляет действие для выбора пользователя на основе параметра URL, оно только отправляет и действие для настройки всех учетных записей.

  @Effect()
  loadUsers$ = this.actions$.pipe(
    ofType(userActions.LOAD_USERS),
    switchMap(() => this.userService.getUsers().pipe(
      map((accounts: UserAccount[]) => new LoadUsersSuccessAction(accounts),
      catchError(() => of(new LoadUsersFailAction()))
    ))
  ));

Как я могу дождаться изменения параметра URL и отправить 2 действия с помощью

a) учетные записи были загружены (LoadUsersSuccessAction) и

b) на основе параметра URL (например, /users/{id}) выбрать пользователя из числа пользователей, полученных с сервера (SelectUserAction)?

EDIT

Я почти уверен, что должен использовать оператор combineLatest, но не знаю, как.

1 Ответ

0 голосов
/ 16 ноября 2018

Для кого это может касаться, я мог бы реализовать поведение следующим выражением:

  @Effect()
  loadAccounts$ = this.actions$.pipe(
    ofType(partnerActions.LOAD_ACCOUNTS),
    switchMap(() =>
      combineLatest(this.partnerService.getAccounts(), of(this.route.firstChild),
        (accounts: UserAccount[], url) => {
          const userId = url.snapshot.params.userId;
          const user = accounts.find(acc => +acc.id === +userId);
          return {
            accounts,
            user
          };
        }
      ).pipe(
        switchMap(({accounts, user}) => [new LoadAccountsSuccessAction(accounts), new SelectAccountAction(user)]),
        catchError(() => of(new LoadAccountsFailAction()))
      )
    ));
...