Я пытаюсь создать простой селектор, чтобы получить все сообщения в магазине с помощью 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[]>
, хотя я импортировал 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}));
Property 'visitor_id' does not exist on type 'unknown'
в функции фильтра, также(visitor_id)
отображается как типObservable<Message[]
в vscode intellisense, хотя это должно быть число. 29.09.2019RxJS
, убедитесь, что вы импортируете правильный модуль. Ознакомьтесь с этим ответом. 29.09.2019val
функции фильтра, которые считаются неизвестными 29.09.2019this.messages$ = this.store.select(selectMessageByVisitorId({ visitor_id: visitor.id}));
ничего не происходит, а точки останова вcreateSelector
вообще не срабатывают. 01.10.2019