angular - Hur använder man filter med switchMap?


Jag har en observerbar som ska bevaka varje chattmeddelande som har typen 'private'

Så det jag försöker göra är att använda funktionen filter() från rxjs för att övervaka varje chattmeddelande som har typen private så att jag kan använda det i min variabel chatMessagePrivate$

Här är vad jag försökte:

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

Och jag får följande fel: Typ 'string' kan inte tilldelas typ 'boolean'

Hur kan jag använda filter() för att få alla ChatMessage med typen 'private'?

Svar #1

filter i RxJS v6+ (jag antar att du använder v6+) är en pipbar operator. Så du behöver använda den så här:

this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid).pipe(
   filter(cr => cr.type === 'private')
);

För vidare läsning: https://www.learnrxjs.io/operators/filtering/filter.html

UPPDATERING:

Eftersom svaret är en array behöver du använda Array.filter. Du kan göra det på följande sätt:

this.chatMessageService.getAllByChatRoomUid$(chatRoom.uid).pipe(
   map(crArr => crArr.filter(cr => cr.type === 'private'))
);

Svar #2

.filter() förväntar sig ett boolean så prova detta:

.filter(chatRoom => chatRoom.type === 'private')

OM detta this.chatMessageService.getAllByChatRoomUid$ (chatRoom.uid) returnerar ett Observable då kan du behöva använda 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')
  )
);

Relaterade artiklar