如何在循环调用 Angular 11 时获取组件的索引

问题描述

嗨,我正在尝试制作多个聊天窗口(例如邮件窗口中的视频群聊)。为此,我创建了一个组件调用 live-session,并为聊天 UI 创建了另一个组件调用 chat-window

我在循环中调用了聊天窗口组件,一切正常,我可以在他们自己的窗口中看到所有聊天内容。但是当我尝试附加一些文件时,它总是将这些文件推送到零索引组件中。

这是我的代码

实时会话(父组件)

  <div class="card">
        <div class="card-body">
          <div class="email-list">
            <ul class="list-unstyled">
              <ng-container *ngIf="active_student_list.length > 0; else nodata">
                <ng-container *ngFor="let student of active_student_list">
                  <li
                    *ngIf="selected_batch._id === student.batch_id"
                    (click)="check_slot(student)"
                    style="cursor: pointer"
                  >
                    <a class="javascript:void(0)">
                      <div class="email-list-item">
                        <div class="email-author">
                          <img
                            src="../../assets/images/avatars/profile-image-1.png"
                            alt=""
                          />
                          <span class="author-name">
                            {{ student.student_name }}
                          </span>
                          <span
                            class="email-date"
                            *ngIf="student.admin_unread_count > 0"
                          >
                            {{ student.admin_unread_count }}
                          </span>
                        </div>
                      </div>
                    </a>
                  </li>
                </ng-container>
              </ng-container>

              <li>
                <ng-template #nodata>
                  <h4 class="h4 warnning">
                    Please Select A batch from the dropdown above
                  </h4>
                </ng-template>
              </li>
            </ul>
          </div>
        </div>
      </div>



//calling component in a loop

  <div class="col-sm-12 col-md-9">
      <div class="row">
        <div
          class="col-12 col-md-4 p-0 p-2"
          *ngFor="let stu of slots; let i = index"
        >
          <app-chat-window
            [chat]="stu"
            [index]="i"
            (onMessageSend)="newMessageSend($event)"
            (onAttachment)="newAttachment($event)"
          ></app-chat-window>
        </div>
      </div>
    </div>

实时 session.ts

  slots: any[] = [];
  // after student selected get their chat
  check_slot(student) {
    this.temp_student = student;
    if (this.slots.length <= 2) {
      this.get_selected_student_chat(student);
    } else {
      this.findindex(student) == -1 ? (this.display = true) : '';
    }
  }

 get_selected_student_chat(student) {
    this.spinner = true;

    // joining room
    if (student.sme_id === localStorage.getItem('uid')) {
      this.live_session_chat_service.join_room({
        room_id: student.student_id + student.batch_id,});
    }
    this.chat_service.get_selected_studentChat(student._id).subscribe(
      (res: any) => {
        const response = res.data;

        this.slots.push({
          chat: student,message: response.message,files: [],});

        this.spinner = false;
      },(error) => this.error_handler(error)
    );
  }


async newMessageSend(data) {
    console.log(data);}

//getting zero index always
  newAttachment(event) {
    console.log(event);
    // this.slots[event.index].files = event.files;
    // console.log(this.slots[event.index]);
  }

chat-window.html


<!-- chat container -->
<div class="" *ngIf="!spinner; else showspinner">
  <div class="card">
    <div class="card-body-custom">
      <ng-container>
        <div
          class="chat-header d-flex justify-content-between align-items-center"
        >
          <h3 class="h3">
            {{ chat.chat.student_name }}
          </h3>
          <div class="control d-flex" *ngIf="chat.chat.sme_id == admin_id">
            <!-- <div class="batch_list">
                <p-dropdown
                  #transfer_admin_id
                  [options]="transfer_admin"
                  placeholder="Transfer Chat"
                  (onChange)="transfer_chat(transfer_admin_id)"
                  optionLabel="name"
                  optionValue="_id"
                  [style]="{ minWidth: '100%','border-radius': '10px' }"
                >
                  <ng-template let-group pTemplate="group">
                    <div class="p-d-flex p-ai-center">
                      <span>{{ group.label }}</span>
                    </div>
                  </ng-template>
                </p-dropdown>
              </div>
              <div class="control">
                <button
                  type="button"
                  class="btn btn-danger"
                  (click)="end_chat()"
                >
                  End Chat
                </button>
              </div> -->
          </div>
        </div>

        <div class="chat-body px-2">
          <div class="d-flex">
            <button
              pButton
              pRipple
              pTooltip="Load more"
              type="button"
              icon="pi pi-cloud-download"
              class="p-button-rounded p-button-outlined m-auto"
            ></button>

            <!-- [disabled]="!selected_student_chat_message"
              (click)="load_more()" -->
          </div>

          <div class="post-comments d-flex flex-column">
            <ng-container *ngIf="chat.message">
              <div
                class="post-comm"
                *ngFor="let message of chat.message"
                [ngClass]="
                  message.sender_type === 'student'
                    ? 'align-self-start'
                    : 'align-self-end'
                "
              >
                <img
                  src="../../assets/images/avatars/profile-image-2.png"
                  class="comment-img"
                  alt=""
                />
                <div class="comment-container pb-2">
                  <span class="comment-author">
                    {{ message.sender_name }}
                    <small class="comment-date" *ngIf="message.created_at">
                      {{ message.created_at | amDateFormat: "hh:mmA" }}</small
                    >
                  </span>
                </div>

                <ng-container *ngIf="message.text_message">
                  <p-divider></p-divider>
                  <span class="comment-text" [innerHTML]="message.text_message">
                  </span>
                </ng-container>

                <div class="attachment" *ngIf="message.attachment?.length > 0">
                  <p-divider></p-divider>
                  <small>Attachments</small>
                  <ul
                    class="d-flex flex-wrap"
                    style="list-style: none; margin: 0; padding: 0"
                  >
                    <li
                      class="mr-2"
                      *ngFor="let file of message.attachment; index as i"
                    >
                      <a
                        [href]="file"
                        target="_blank"
                        [ngClass]="{
                          'text-white': message.sender_type === 'student'
                        }"
                        >file{{ i }}</a
                      >
                    </li>
                  </ul>
                </div>
              </div>
            </ng-container>
          </div>
        </div>

        <!-- chat form -->
        <div class="chat-new-footer">
          <ng-container *ngIf="chat.chat.sme_id; else startchat">
            <div class="footer-Box col-12 mt-3 mt-md-4 p-0">
              <div class="textarea">
                <textarea name="" id="" cols="30" rows="2" #textarea></textarea>
              </div>

              <div class="function-button d-flex">
                <div class="file">
                  <input
                    type="file"
                    multiple
                    (change)="attchment($event,index)"
                    name="file"
                    id="file"
                  />
                  <label for="file" title="select files">
                    <span><i class="fas fa-paperclip"></i></span>
                    <span *ngIf="chat.files.length > 0">
                      {{ chat.files.length }}
                    </span>
                  </label>
                </div>

                <div class="button">
                  <button
                    class="btn btn-primary"
                    *ngIf="!message_sending; else wait"
                    (click)="send_message(textarea)"
                  >
                    <!-- *ngIf="!message_sending; else wait"
                  [disabled]="!text && files.length == 0"
                  (click)="send_message(textarea)" -->
                    Send
                  </button>
                  <ng-template #wait>
                    <button
                      pButton
                      pRipple
                      type="button"
                      icon="pi pi-spin pi-spinner"
                      class="p-button-rounded"
                      disabled="true"
                    ></button>
                  </ng-template>
                </div>
              </div>
            </div>
          </ng-container>

          <ng-template #startchat></ng-template>
        </div>
      </ng-container>
    </div>
  </div>
</div>

<audio src="../../../assets/Sound/pop.mp3" #sound></audio>

<ng-template #showspinner>
  <div class="spinner">
    <app-spinner></app-spinner>
  </div>
</ng-template>


chat-window.ts

  @input() chat: any;
  @input() index: any;
  @Output() onMessageSend: EventEmitter<any> = new EventEmitter();
  @Output() onAttachment: EventEmitter<any> = new EventEmitter();
  spinner: boolean = true;

  // attachment
  attchment(event) {
    this.files = [];
    for (let i = 0; i < event.target.files.length; i++) {
      this.files.push(event.target.files[i]);
    }

    console.log(event);
    this.onAttachment.emit({ event: event,index: this.index });
  }

  async send_message(message) {
    console.log(this.index);

    // if (message.value == '' && this.files.length == 0) {
    //   return;
    // }

    // this.message_sending = true;
    const message_obj = {
      text_message: message.value,sme_id: localStorage.getItem('uid'),sender_name: this.admin.name,sender_type: 'admin',attachment: [],created_at: new Date(),};

    this.onMessageSend.emit({ message: message_obj,index: this.index });

}

我不知道哪里出错了,我只需要选择文件的那个组件的索引。

**用户界面**

multiple chat window

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)