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

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

@Injectable({
  providedIn: 'root'
})
export class MaterialService {
  private url = "materials";

  constructor(private http: HttpClient) { }

  getMaterials () {
    return this.http.get (this.url).pipe (
      catchError (this.handleError)
    );
  }

  handleError (error: HttpErrorResponse): Observable<never> {
    return throwError (error.message);
  }
}
@Injectable()
export class MaterialEffects {

  @Effect() loadMaterial$ = this.dataPersistence.fetch(
    MaterialActionTypes.LoadMaterial,
    {
      run: (action: LoadMaterial, state: MaterialPartialState) => {

        return this.materialService.getMaterials ().pipe (
          map (data => {
            return new MaterialLoaded(data);
          }),
//          catchError (error => of (new MaterialLoadError (error)))
        );
      },

      onError: (action: LoadMaterial, error) => {
        console.error('Error', error);
        return new MaterialLoadError(error);
      }
    }
  );
...

В целом, он прекрасно работает.Мне это просто нравится:)

Но для определенных запросов мне нужно восстановить какой-то идентификатор, чтобы создать мой URL.Эти идентификаторы в основном являются общими идентификаторами.Например, идентификатор нашего клиента.https://my.example.com/perimeters/[PERIMETER_ID]/relationships/users

Как я могу использовать свой сервис для извлечения идентификатора своего контента из моего магазина, создания моего URL и возврата моего Observable, как и ожидалось?

Заранее спасибо

1 Ответ

1 голос
/ 26 июня 2019

Добавьте хранилище в ваш класс эффектов MaterialEffects, получите нужное значение и передайте его в качестве параметра в MaterialService.

Итак, ваш эффект будет выглядеть так:

@Injectable()
export class MaterialEffects {

    constructor(private store: Store<any>)

    @Effect() loadMaterial$ = this.dataPersistence.fetch(
        MaterialActionTypes.LoadMaterial,
        {
            run: (action: LoadMaterial, state: MaterialPartialState) => {

                return this.store.pipe(
                    select(x => x.perimiterId),
                    mergeMap((perimiterId) => {
                        materialService.getMaterials(perimiterId).pipe(
                            map(data => {
                                return new MaterialLoaded(data);
                            }),
                            // catchError (error => of (new MaterialLoadError (error)))
                        )
                    })
                )
            },

            onError: (action: LoadMaterial, error) => {
                console.error('Error', error);
                return new MaterialLoadError(error);
            }
        }
    );
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...