Удалить в цикле ? Угловой

#angular #ngx-bootstrap

Вопрос:

Пример:

Вся проблема в том, что МНЕ НУЖНО остановить распространение() и попробовать это:

Откройте первый раскрывающийся список, затем откройте второй раскрывающийся список

Оба выпадающих списка все еще открыты… Мне нужно закрыть первый, если открыть второй раскрывающийся список.

Я постараюсь объяснить лучше.

Мне нужно и нужно использовать остановку, и в этом вся проблема.

Мне нужно решение о том, как использовать stopPropagation и при этом не допускать одновременного открытия нескольких раскрывающихся списков

Ответ №1:

// Код JavaScript, чтобы избежать выпадающего списка // закрыть меню

     // Clicking dropdown button will toggle display
    function btnToggle() {
        document.getElementById("Dropdown").classList.toggle("show");
    }
      
    // Prevents menu from closing when clicked inside
    document.getElementById("Dropdown").addEventListener('click', function (event) {
        alert("click outside");
        event.stopPropagation();
    });
      
    // Closes the menu in the event of outside click
    window.onclick = function(event) {
        if (!event.target.matches('.dropbutton')) {
          
            var dropdowns = 
            document.getElementsByClassName("dropdownmenu-content");
              
            var i;
            for (i = 0; i < dropdowns.length; i  ) {
                var openDropdown = dropdowns[i];
                if (openDropdown.classList.contains('show')) {
                    openDropdown.classList.remove('show');
                }
            }
        }
    }
 

Можете ли вы попробовать этот поток

Ответ №2:

вы можете сохранить последний открытый раскрывающийся список и закрыть его при следующем щелчке:

 import { BsDropdownDirective } from 'ngx-bootstrap/dropdown';

@Component({
  // eslint-disable-next-line @angular-eslint/component-selector
  selector: 'demo-dropdown-autoclose',
  templateUrl: './autoclose.html'
})
export class DemoDropdownAutoCloseComponent {

  private lastOpened: BsDropdownDirective = null;
  
  arr: any = [
    { id: 1, name: 'Test one' },
    { id: 2, name: 'Test two' },
    { id: 3, name: 'Test three' }
  ];

  clickDropdown(event: Event, dropdown: BsDropdownDirective): void {
    event.stopPropagation();

    if (!!this.lastOpened) {
      this.lastOpened.hide();
    }
    this.lastOpened= dropdown;
  }
}

 
 <div class="row" *ngFor="let singleArr of arr">
  <div class="col-xs-12 col-12 col-sm-6 mb-3">
    <p>Default behavior: dropdown closes after outside click or pressing ESC</p>
    <div class="btn-group" dropdown #dropdown="bs-dropdown">
      <button id="button-autoclose1" dropdownToggle  type="button" class="btn btn-primary dropdown-toggle"
      (click)="clickDropdown($event, dropdown)">
        Button dropdown <span class="caret"></span>
      </button>
      <ul id="dropdown-autoclose1" *dropdownMenu class="dropdown-menu" role="menu" aria-labelledby="button-autoclose1">
        <li role="menuitem"><a class="dropdown-item" href="#">Action</a></li>
        <li role="menuitem"><a class="dropdown-item" href="#">Another action</a></li>
        <li role="menuitem"><a class="dropdown-item" href="#">Something else here</a></li>
      </ul>
    </div>
  </div>

 

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

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

2. вы можете проверить последнее открытие новой записью: ` если (!!это.Последнее открытие amp;amp; это.Последнее открытие !== выпадающий список) { это.Последнее открытие.скрыть(); } «

3. stackblitz.com/edit/… Проверьте свою версию. Попробуйте открыть первым. Нажмите снаружи. Попробуйте снова открыть первый выпадающий список? никакой работы.

4. stackblitz.com/edit/…