Доступ к состоянию из эффектов в приложении Angular 8 - PullRequest
0 голосов
/ 24 октября 2019

Я работаю с Metronic, который является начальным / административным сайтом, написанным на Angular.

Я пытаюсь загрузить определенный набор данных с использованием идентифицированного идентификатора пользователя.

Это мой эффект:

@Injectable()
export class ProjectEffects {

    @Effect()
    loadAllProjects$ = this.actions$
        .pipe(
            ofType<AllProjectsRequested>(ProjectActionTypes.AllProjectsRequested),
            withLatestFrom(this.store.pipe(select(allProjectsLoaded))),
            filter(([action, isAllProjectsLoaded]) => !isAllProjectsLoaded),

            mergeMap(() => this.projectService.getProjectsByOwnerId(4)),

            map(result => {
                return new AllProjectsLoaded({projects: result});
            }),
            catchError(error => {
                console.debug("error [%s]", error); 
                return of({ results: null });
            })      
          );

    @Effect()
    init$: Observable<Action> = defer(() => {
        return of(new AllProjectsRequested());
    });

    constructor(private actions$: Actions, private projectService: ProjectService, private store: Store<AppState>) { }

}

Это мой селектор:

export const currentUser = createSelector(
    selectAuthState,
    auth => auth.user
);

Проблема, с которой я столкнулся, заключается в том, как извлечь текущего пользователя из хранилища и передать значение user.id вthis.projectService.getProjectsByOwnerId (n).

Я пробовал многочисленные комбинации

this.user $ = this.store.pipe (select (currentUser))

и подписка на наблюдаемое без какой-либо удачи.

Какой «правильный» способ получить доступ к currentUser из хранилища синхронным способом?

1 Ответ

1 голос
/ 24 октября 2019

Вы близки, вы можете использовать withLatestFrom, как вы сделали с allProjectsLoaded.

Пример:

@Effect()
getOrder = this.actions.pipe(
  ofType<GetOrder>(ActionTypes.GetOrder),
  withLatestFrom(action =>
    of(action).pipe(
      this.store.pipe(select(getOrders))
    )
  ),
  filter(([{payload}, orders]) => !!orders[payload.orderId])
  mergeMap([{payload}] => {
    ...
  })
)

Подробнее см. https://timdeschryver.dev/posts/start-using-ngrx-effects-for-this#4-using-a-selector-inside-your-effectsИнформация.

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