angular - Hvordan bruke filter med switchMap?
Jeg har en observable som skal overvåke hver Chat-melding som har en type 'private'
Så det jeg prøver å gjøre er å bruke funksjonen filter() fra rxjs for å overvåke hver Chat-melding som har typen private slik at jeg kan bruke den i min variabel chatMessagePrivate$
Her er hva jeg prøvde:
export type ChatType = 'private' | 'standard';
export class ChatMessage {
uid?: string;
chatRoomUid: string;
type: ChatType;
}
chatMessagePrivate$: Observable<ChatMessage[]>;
ngOnInit() {
this.chatMessagePrivate$ = this.chatRoom$.pipe(
switchMap((chatRoom: ChatRoom) => this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid) // this function returns every message from the uid of the chatroom
.filter(chatRoom => 'private')
)
);
}
Og jeg får følgende feilmelding: Type 'string' kan ikke tilordnes typen 'boolean'
Hvordan kan jeg bruke filter() for å få alle ChatMessage med typen 'private'?
Svar #1
filter i RxJS v6+ (jeg antar du bruker v6+) er en pipebar operator. Så du må bruke den slik:
this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid).pipe(
filter(cr => cr.type === 'private')
);
For videre lesing: https://www.learnrxjs.io/operators/filtering/filter.html
OPPDATERING:
Siden responsen er et array, må du bruke Array.filter. Du kan gjøre det som følger:
this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid).pipe(
map(crArr => crArr.filter(cr => cr.type === 'private'))
);
Svar #2
.filter() forventer en boolean, så prøv dette:
.filter(chatRoom => chatRoom.type === 'private')
HVIS dette this.chatMessageService.getAllByChatRoomUid$ (chatRoom.uid) returnerer en Observable, må du kanskje bruke pipe:
this.chatMessagePrivate$ = this.chatRoom$.pipe(
switchMap((chatRoom: ChatRoom) => this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid)) // this function returns every message from the uid of the chatroom
,filter(chatRoom => chatRoom.type === 'private')
)
);
