Как использовать Отображение класса в раскрывающемся списке в Angular

#angular #angular-directive #bootstrap-5 #angular2-hostbinding

Вопрос:

Я пытаюсь использовать директиву для активации раскрывающегося меню в своем проекте Angular. Класс «открыть» устарел с начальной загрузки 3, но в настоящее время я использую начальную загрузку 5 и как использовать класс «показать» вместо «открыть»?

моя Директива:

 import { Directive, HostListener } from '@angular/core';

@Directive({
  selector: '[appDropDown]',
})
export class DropDownDirective

{
  @HostBinding('class.open') isOpen = false;

  @HostListener('click') toggleOpen() {
    this.isOpen = !this.isOpen;
  }
  constructor() {}
}
 

мой HTML-фрагмент из компонента:

 <div
      class="btn-group"
      appDropDown>
      <button
        type="button"
        class="btn btn-primary dropdown-toggle ">
        Manage Recipe <span class="caret"></span>
      </button>
      <ul class="dropdown-menu">
        <li><a href="#">To Shopping List</a></li>
        <li><a href="#">Edit Recipe</a></li>
        <li><a href="#">Delete Recipe</a></li>
      </ul>
    </div>
  </div>
 

Спасибо.

Ответ №1:

Одной из возможностей может быть добавление правила в компонент или глобальный CSS:

 div.btn-group.open ul.dropdown-menu {
  display: block;
} 

Я подозреваю, что ваш HostBinding Hostlistener применяет класс «открыть» к div, в котором находится ваш селектор привязки хоста. Этого само по себе, вероятно, недостаточно с правилами CSS, которые у вас в настоящее время есть в вашем проекте, чтобы отобразить раскрывающийся список.

Чтобы решить аналогичную проблему с самим Angular, а не с помощью простых правил CSS, я сделал следующее:

 @Directive({
  selector: '[dropdownMenu]'
})
export class DropdownMenuDirective {
  private isShown: boolean = false;
  @HostListener('click') toggleOpen() {

    if (this.isShown) {
      this.renderer.removeClass(this.elRef.nativeElement, 'show');
    } else {
      this.renderer.addClass(this.elRef.nativeElement, 'show');
    }

    this.isShown = !this.isShown;
  }

  constructor(private elRef: ElementRef, private renderer: Renderer2) {}
} 
 <button class="navbar-toggler" type="button" dropdownMenu>
  <span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse">
  <ul class="navbar-nav me-auto mb-2 mb-lg-0">
    <li class="nav-item">
      <a class="nav-link" href="#" (click)="navigate(false)">Option 1</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#" (click)="navigate(true)">Option 2</a>
    </li>
  </ul>
</div> 

Ответ №2:

 <div class="btn-group" appDropdown #r="appDropdown" >
  <button  type="button" class="btn btn-primary dropdown-toggle" data-bstoggle="dropdown">
    Manage Recipe <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" [ngClass]="{'show':r.isOpen}">
    <li><a class="dropdown-item" href="#">To shopping list</a></li>
    <li><a class="dropdown-item" href="#">Edit Recipe</a></li>
    <li><a class="dropdown-item" href="#">Delete Recipe</a></li>
  </ul>
</div>
 

В ts файл добавить exportAs вместе с селектором:

 selector: '[appDropdown]',
exportAs:'appDropdown'