在带有道具的createSelector ngrx中进行过滤

时间:2019-09-28 17:51:49

标签: angular rxjs ngrx ngrx-entity

我正在尝试创建一个简单的选择器,以通过visitor_id获取存储中的所有消息,但是,看起来如此简单的操作始终很难在ngrx中实现。

我正在使用ngrx实体,因此我已经准备好selectAll选择器,因此我尝试执行以下操作:

export const selectMessagesState = createFeatureSelector<MessagesState>('messages');

export const selectAllMessages =  createSelector(
    selectMessagesState,
    fromMessage.selectAll
);

export const selectMessageByVisitorId = createSelector(
    select(selectAll),
    (visitor_id) => map(val => val.filter(c => c.visitor_id == visitor_id))
);

以及组件中的

export class Message {
    id: number;
    message: string;
    visitor_id: number;
    is_from_visitor: boolean;
    created_at: string;
}
public messages$ : Observable<Message[]>;

public showThread(visitor: Visitor){

   this.messages$ = this.store.select(selectMessageByVisitorId({ visitor_id: visitor.id}));

但是我在Property 'filter' does not exist on type 'unknown'中得到了selectMessageByVisitorId。我很确定我没有遵循正确的方法。我想做的很简单,将visitor id传递到selectMessageByVisitorId选择器,它返回功能存储中的消息列表,并由visitor_id过滤。

更新#1

按照@Nikhil的建议,我将选择器更改为:

export const selectMessageByVisitorId = ({visitor_id}) => createSelector(
    select(selectAll),
    messages => messages.filter(val => val.visitor_id == visitor_id)
);

尽管我导入了Property 'filter' does not exist on type 'Observable<Message[]>(尽管使用的是ngrx 8.0),但我却得到了import { filter} from 'rxjs/operators';

所以我尽管尝试:

export const selectMessageByVisitorId = ({visitor_id}) => createSelector(
    select(selectAll),
    messages => messages.pipe(
            map(val => val.filter(c => c.visitor_id == visitor_id)  ) 
        )
);

但是现在我在组件文件Type 'Observable<Observable<Message[]>>' is not assignable to type 'Observable<Message[]>'.中得到了this.messages$ = this.store.select(selectMessageByVisitorId({ visitor_id: visitor.id}));

1 个答案:

答案 0 :(得分:1)

map()此处不需要,只需使用filter()

方法1:

export const selectMessageByVisitorId = ({visitor_id}) => createSelector(   
    pipe(
     select(selectAll),
     filter(val => val.visitor_id == visitor_id)
    )
);

方法2:

export const selectAllMessages =  createSelector(
    selectMessagesState,
    fromMessage.selectAll
);

export const selectMessageByVisitorId = ({visitor_id}) => createSelector(
    selectAllMessages,
    messages => messages.filter(val => val.visitor_id == visitor_id)
);

然后订阅消息。

this.messages$ = this.store.select(
  selectMessageByVisitorId({visitor_id: visitor.id})
);

this.messages$.subscribe((messages) => {
  // Handle response.
  console.log(messages);
});