Angular & NGRX: фильтрация по селектору с использованием сущности NGRX - PullRequest
0 голосов
/ 23 октября 2018

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

 //reducer.ts

  case MessagesActionTypes.LOAD_Message_SUCCESS: {
      console.log('reducer='+ 
      JSON.stringify(action.payload.Messages));//receiving data here
      return adapter.addAll(action.payload.Messages, state);
    }

    export const getSelectedMessageId = (state: MessageState) => state.selectedMessageId;

// get the selectors
const { selectIds, selectEntities, selectAll, selectTotal } = adapter.getSelectors();


// select the array of Messages
export const selectAllMessages = selectAll;

Ниже находится селектор

 //     Selector.ts

export const selectHomeQueues = createSelector(
  fromReducer.selectAllMessages,
 (messages) => messages.filter(message => message.queue === 'HOME')
 );

Я получаю данные в редукторе, но получаю ошибку в селекторе во время выполнения ERROR TypeError: Cannot read property 'map' of undefined

Примечание. Мне не удалось найти ни одного примера фильтрации в селекторах сущностей NGRX.

Как отфильтровать селекторы в сущности NGRX?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Ошибка «Не удается прочитать свойство 'map' of undefined» предполагает, что вы получаете ошибку в другом месте, потому что в коде, который вы указали в своем вопросе, мы не видим нигде map.

В вашем селектореВы фильтруете на messages, и он проходит header, который никогда не используется. появляется . Вы не фильтруете отдельные сообщения, а очереди сообщений, поэтому:

export const selectHomeQueues = createSelector(
  fromReducer.selectAllMessages,
 (messages) => messages.queue === 'HOME'
 );
0 голосов
/ 14 мая 2019

У меня была точно такая же проблема.Вам нужно немного изменить селектор:

export const selectHomeQueues = createSelector(
  selectAllMessages,
 (messages) => messages.filter(message => message.queue === 'HOME')
 );

Где selectAllMessages - это селектор, который вы определили просто как:

export const selectAllMessages = createSelector(
  fromReducer.selectAllMessages
 );

То, как мы пытались это сделатьПервоначально было через адаптер, и я подозреваю, что мы допустили небольшую ошибку или заблуждение где-то по пути.

0 голосов
/ 23 октября 2018

Я думаю, вы можете сделать это так:

const getSelectHomeQueues = (store) => {
    return store.select(fromReducer.selectAllMessages)
        .filter(message => message.queue === 'HOME')
}

Где бы вы ни хотели использовать:

getSelectHomeQueues(this.store).subscribe(...)
...