Селектор NGRX запрашивает данные, прежде чем они станут доступны в магазине - PullRequest
0 голосов
/ 31 августа 2018

Когда пользователь выбирает элемент на экране, запускается действие, которое запрашивает данные из API и загружает эти данные в хранилище для выбранного элемента.

Селектор используется для захвата определенных фрагментов возвращенных данных для создания графика.

Селектор возвращает неопределенное значение, потому что в хранилище еще нет этих данных.

Мне нужно, чтобы store / action / dispatch сообщал вызову селектора, что он готов, или позволяет селектору продолжать запрашивать до тех пор, пока он не получит данные, которые он ищет:

this.setItemDispatch(this.datetime, this.selectedItem, this.direction);

this.store.select(selectFlyoutTimelineBar(this.selectedItem, this.direction, 'Graph Title')).subscribe(x => {
  console.log('data returned:', x);
});

Отправка:

this.store.dispatch(
          new LoadStationArriveTimelineDataAction({
            station: selectedItem,
            start: { startDate: currentDate },
            query: this.codes,
            lineQuery: this.lineCode
          })
        );

Ответы [ 5 ]

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

Кажется, вам нужно определить initialState и сделать его значением по умолчанию для вашего редуктора.

export const initialState: State = { prop1: null, prop2: null }

Тогда в вашем редукторе

export class reducer(state: State = initialState, action: YourAction)

Он обязательно исключит undefined и хорошо обработает хранилище, прежде чем значение станет доступным.

0 голосов
/ 31 августа 2018

Если данные недоступны, селектор возвращает ноль. Тогда в вашем сабе вы можете отфильтровать ноль следующим образом:

this.store.select(selectFlyoutTimelineBar(this.selectedItem, this.direction, 'Graph Title'))
  .pipe(
    filter(x => x != null)
  )
  .subscribe(x => {
    console.log('data returned:', x);
  });

Это заставит подпрограмму выполняться только тогда, когда селектор не возвращает ноль. PS ваш оператор выбора должен быть внутри канала ()

0 голосов
/ 31 августа 2018

Аналогично тому, что @timdeschryver сказал: «Селектор - это наблюдаемый RxJS, каждый раз, когда его данные изменяются, он выдает новое значение. Это означает, что вам не нужно уведомлять селектор об обновлении». мой селектор не собирал обновления в магазине, потому что не было ничего, что сообщало моему селектору, что магазин обновил. Мой селектор фильтрует данные магазина, а не отслеживает прямое изменение товаров в магазине.

У меня есть другой селектор, который ищет изменения для определенных элементов. Я подписался на этот селектор и вложил туда свой селектор selectFlyoutTimelineBar, который, по сути, говорит: «когда выбранный вами элемент обновлен, возьмите графические данные, потому что он теперь доступен»

0 голосов
/ 31 августа 2018

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

const selector$ = action$.pipe(ofType(...))

combineLatest(this.store.select(...), selector$)
  .pipe(
    map([data, selector] => /* filter data or whatever */)
  )
  .subscribe(...)

Может быть, вам даже не нужно использовать map().

Если селектор является другим Observable, и вам нужно его значение, прежде чем делать запрос this.store.select(...), вы можете связать его с помощью concatMap, например:

selector$
  .pipe(
    concatMap(selector => this.store.select(...selector...))
  )
  .subscribe(...)
0 голосов
/ 31 августа 2018

Вы можете использовать операцию RxJS filter.

this.store.pipe(
  select(selectFlyoutTimelineBar(this.selectedItem, this.direction, 'Graph Title')),
  filter(result => Boolean(result))
)

Мне либо нужен магазин / действие / отправка, чтобы подать сигнал на звонок Селектор, что он готов ИЛИ позволяет селектору продолжать запрашивать пока у него нет данных, которые он ищет:

Селектор является наблюдаемым RxJS, каждый раз, когда его данные изменяются, он выдает новое значение. Это означает, что вам не нужно уведомлять селектор об обновлении.

...