Как указать элемент для удаления в массиве Typescript? - PullRequest
1 голос
/ 16 апреля 2020

В моем приложении Angular есть следующие модели Conversation & Message:

export class Conversation {
    constructor(
        public id: string,
        public userId: string,
        public mechanicId: string,
        public messages: Message[]
    ) { }
}

export class Message {
    constructor(
        public id: string,
        public text: string,
        public userId: string,
        public timestamp: Date
    ) { }
}

Вот где я заполняю данные:

private _conversations = new BehaviorSubject<Conversation[]>([
    new Conversation(
      'conversation1',
      'user3',
      'user1',
      [
        new Message('message1', 'Test message', 'user3', new Date(2018, 0O5, 0O5, 17, 23, 42, 11)),
        new Message('message2', 'Another message', 'user1', new Date(2018, 0O6, 0O5, 17, 23, 42, 11))
      ]),
    new Conversation(
      'conversation2',
      'user4',
      'user2',
      [
        new Message('message3', 'my  message', 'user4', new Date(2018, 0O7, 0O7, 17, 23, 42, 11)),
        new Message('message4', 'more messages', 'user2', new Date(2018, 0O7, 0O7, 17, 23, 42, 11)),
      ])
  ]);

Я пытаюсь удалить указанный Message в Conversation.

Например, я хочу удалить сообщение с id = message3, которое находится внутри conversation2.

I В настоящее время я могу удалить все Conversation:

deleteConversation(convoId: string) {
    return this.conversations.pipe(
      take(1),
      delay(1000),
      tap(conversations => {
        this._conversations.next(conversations.filter(convo => convo.id !== convoId));
      }));
  }

Но я пытаюсь применить этот код к deleteMessage():

deleteMessage(conversationId: string, messageId: string) {
    return this.conversations.pipe(
      take(1),
      delay(1000),
      tap(conversations => {

      })
    )
  }

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Если у вас есть convoToUpdate, почему вы не делаете тот же фильтр?

convoToUpdate.messages = [...convoToUpdate.messages.filter(message => message.id != messageId)]
1 голос
/ 16 апреля 2020

Попробуйте:

deleteMessage(conversationId: string, messageId: string) {
    return this.conversations.pipe(
        take(1),
        delay(1000),
        tap(conversations => {
            this._conversations.next(conversations.map(convo => {
                if (convo.id === conversationId) {
                    convo.messages = convo.messages.filter(mes => mes.id !== messageId)
                }
                return convo;
            }));
        })
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...