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

Relaterte artikler