4

我正在尝试通过属性过滤掉有效负载数据。

 //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 实体中的选择器?

4

3 回答 3

4

我有完全相同的问题。您需要将选择器稍微更改为:

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

selectAllMessages您简单定义为的选择器在哪里:

export const selectAllMessages = createSelector(
  fromReducer.selectAllMessages
 );

我们最初尝试这样做的方式是通过适配器,我怀疑我们在此过程中的某个地方犯了一个小错误或误解。

于 2019-05-14T13:58:58.327 回答
0

错误“无法读取未定义的属性'map'”表明您在其他地方遇到错误,因为在您在问题中提供的代码中,我们在map任何地方都看不到。

在您的选择器中,您正在过滤messages并且它通过header了从未使用过的。看来您不是在过滤单个消息,而是在过滤消息队列,因此

export const selectHomeQueues = createSelector(
  fromReducer.selectAllMessages,
 (messages) => messages.queue === 'HOME'
 );
于 2018-10-23T16:58:45.880 回答
0

我认为你可以这样做:

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

无论您想在哪里使用它:

getSelectHomeQueues(this.store).subscribe(...)
于 2018-10-23T16:43:45.783 回答