Почему я не могу заставить мои отображать правильный HTML-код, когда я использую событие click для элемента html?

#angular #angular9

#angular #angular9

Вопрос:

Я создал календарь, в котором я хочу иметь возможность планировать что-либо при нажатии в каждой ячейке. Если у меня есть, например, существующая «встреча», при нажатии на нее или внутри <li> нее должно появиться выпадающее окно с надписью «Просмотреть встречу».

Если я нажимаю за пределами уже существующей встречи внутри элемента, при нажатии на него я хочу, чтобы отображалось всплывающее выпадающее окно, в котором отображается другой набор параметров меню, таких как «Добавить время», «Время просмотра», «Добавить встречу», «Просмотреть встречи».

Вот файл .html

 <ng-container *ngIf="entries.length > 0 || appointments.length > 0 || recurrances.length > 0">
              <tr *ngFor="let w of allDates">
                <td class='days clickable' *ngFor="let d of w" (click)="openMenu($event,d)">
                  <span class="top-left">{{d.getDate()}}</span>
                  <h4 class="center">{{ getHours(d) }}</h4>
                    <ul>
                      <li class="sticky-note" *ngFor="let a of getAppointments(d)" (click)="openMenu2($event,a)">
                        {{a}}
                      </li>
                    </ul>
                </td>
              </tr>
            </ng-container>

            <ng-container *ngIf="entries.length == 0 amp;amp; appointments.length == 0 amp;amp; recurrances.length == 0">
              <tr *ngFor="let w of allDates">
                <td class='days' (click)="openMenu($event, d)" *ngFor="let d of w">
                    <span class="top-left">{{d.getDate()}}</span>
                </td>
              </tr>
            </ng-container>
        </table>
    </div>
</div>

<ng-template #userMenu let-e>
  <section class="user-menu">
    <div class="user-menu-item" (click)="showTicket(e)">View Ticket</div>
    <div class="user-menu-item" (click)="addTimeEntry(e)">Add time</div>
    <div class="user-menu-item" (click)="showTimeEntries(e)">View time</div>
    <div class="user-menu-item" (click)="addAppointment(e)">Add appointment</div>
    <div class="user-menu-item" (click)="showAppointmentEntries(e)">View appointments</div>
  </section>
</ng-template>
<ng-template #userMenu2 let-a>
  <section class="user-menu">
    <div class="user-menu-item" (click)="showAppointmentEntry(a)">View appointment</div>
  </section>
</ng-template>
 

С приведенным выше HTML-кодом я отображаю только первый <ng-template> , независимо от того, нажимаю ли я внутри <td> элемента, но вне <li> элемента, или внутри <li> элемента, но не внутри ` элемента.

Итак, как я могу это исправить, чтобы он отображал второй <ng-template> , когда я щелкаю внутри <li> элемента, и отображал только первый <ng-template> , когда я щелкаю вне <li> элемента?

Соответствующий код .ts

 @ViewChild('userMenu') userMenu: TemplateRef<any>;
@ViewChild('userMenu2') userMenu2: TemplateRef<any>;

openMenu(event: MouseEvent, param: any) { this.popup.open(event,this.userMenu,param,'start','center'); }
openMenu2(event: MouseEvent, appointment: IAppointment) { this.popup.open(event,this.userMenu2,appointment,'start','center'); console.log("click")}
closeMenu() { this.popup.close(); }
 

Комментарии:

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

2. Это большое приложение, поэтому настройка всего займет некоторое время. Я посмотрю, что я могу сделать

Ответ №1:

Angular — довольно мощная платформа, на основе которой я могу предложить вам решение вашей проблемы,

Сначала дайте ссылку на хэш в td качестве #tdElement ,

затем используйте (mouseenter) (mouseleave) события и li для добавления и удаления класса do-not-click на td

наконец, обработайте td событие click на основе добавленного класса do-not-click

вот демонстрация

 <td class='days clickable'
    #tdElement 
    *ngFor="let d of w" 
    (click)="tdElement.classList.contains('do-not-click') ? false : openMenu($event,d)">
     <span class="top-left">{{d.getDate()}}</span>
     <h4 class="center">{{ getHours(d) }}</h4>
     <ul>
        <li class="sticky-note" 
            *ngFor="let a of getAppointments(d)"
            (mouseenter)="tdElement.classList.add('do-not-click')" 
            (mouseleave)="tdElement.classList.remove('do-not-click')"
            (click)="openMenu2($event,a)">
          {{a}}
        </li>
     </ul>
 </td>