Как передать значения во внутренний массив при создании объекта Angular? - PullRequest
0 голосов
/ 09 апреля 2020

Ниже представлены модели Conversation & Message, которые я использую в своем приложении Ioni c 5 / Angular:

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: string
    ) { }
}

Когда пользователь создает объект Conversation, я хочу, чтобы он добавил 1 Message объект в Conversation.

Затем, когда другие применения обновляют , Conversation (то есть, отправляя больше сообщений) , они просто будут толкать еще один Message к Conversation.

Вот что у меня есть для создания Conversation :

onSendMessage() {
    this.conversationService.addConversation(
        this.mechanicToContact.id,
        this.form.value.message
    );
}

Я попробовал следующий метод в моем ConversationService:

addConversation(mechanicId: string, message: string) {
    const newConversation = new Conversation(
      Math.random().toString(),
      this.authService.userId,
      mechanicId,
      new Message(Math.random().toString(), message, this.authService.userId, mechanicId)
      );
  }

Но я получаю эту ошибку при попытке создать новое Сообщение:

Аргумент типа «Сообщение» не может быть назначен параметру типа «Сообщение []»

Я не уверен, как мне передать остальные атрибуты Message. Может кто-нибудь сказать, пожалуйста, как это делается?

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Ну, класс Conversation ожидает Message[], который является массивом сообщений, и вы отправляете Message. Пара способов это исправить. Одно из них:

const newConversation = new Conversation(conversationId, userId, mechanicId, [ message ]);

Это просто оборачивает сообщение в массив.


Другое:

export class Conversation {
    public messages: Message[];

    constructor(
        public id: string,
        public userId: string,
        public mechanicId: string,
        messages: Message | Message[]
    ) { 
      this.messages = Array.isArray(messages) ? messages : [ messages ];
    }

    addMessages(messages: Message | Message[]): void {
       this.messages.push(
          ...(Array.isArray(messages) ? messages : [ messages ])
       );
    }
}

Это позволит принять оба массив как объект сообщения, и обрабатывает правильный путь внутри класса.


Более распространено, чтобы сервис обрабатывал это. Вы можете думать о чем-то вроде этого:

export interface Conversation {
  id: string;
  userId: string;
  mechanicId: string;
  messages: Message[];
}

@Injectable({
  providedIn: 'root'
})
export class ConversationService {
  private conversations: Conversation[];

  addConversation(mechanicId: string, message: string): Conversation {
    const conversation: Conversation = {
      id: getUniqueUid() // something like this,
      userId: this.userService.getUserId() // something like this
      mechanicId,
      messages: [ this.createMessage(message) ] 
    };

    this.conversations.push(conversation);

    return conversation;
  }

  addToConversation(id: string, mechanicId: string, message: string): Conversation {
    const conversation = this.getConversation(id);

    if (conversation) {
      conversation.messages.push(
        this.createMessage(message)
      );
    }

    return conversation;
  }

  private createMessage(message: string): Message {
    return {
      id: getUniqueMid() // something like this,
      text: message,
      userId: this.userService.getUserId(),
      timestamp: Date.now()
    };
  }

  private getConversation(id: string): Conversation | undefined {
    return this.conversations.find((conversation) => conversation.id === id); 
  }
}
0 голосов
/ 09 апреля 2020

Ваша функция addConversation должна быть такой:

addConversation(userId: string, mechanicId: string, messages: Message[]) {
    const newConversation = new Conversation(conversationId, userId, mechanicId, messages);
  }

Вы используете массив в своем классе разговора, но в качестве параметра передаете ему только одно сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...