фильтр в createSelector ngrx с реквизитом - PullRequest
2 голосов
/ 28 сентября 2019

Я пытаюсь создать простой селектор, чтобы получить все сообщения в хранилище на visitor_id, однако, то, что кажется таким простым, всегда трудно достичь в ngrx.

I 'Я использую сущность 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 selectir, где он возвращает список сообщений в хранилище возможностей, отфильтрованный с помощью visitor_id.

Update # 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[]>, событие, хотя я импортировал import { filter} from 'rxjs/operators'; (я использую ngrx 8.0).

Итак, я пытался:

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 голосов
/ 28 сентября 2019

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)
);
...