ng-bootstrap 同时关闭多个下拉菜单

ng-bootstrap close mutliple drowdowns simultaneously

我的 Angular 应用程序中有两个下拉菜单:

<div class="input-group">
  <input
    id="startDate"
    type="text"
    class="form-control"
    aria-label="Start date"
    dlDateTimeInput
    [ngModel]="startDate"
  />
  <div ngbDropdown class="d-inline-block">
    <div class="input-group-append">
      <button
        class="btn btn-outline-primary"
        id="startDateDropdown"
        ngbDropdownToggle
      >
        <i class="oi oi-calendar"></i>
      </button>
      <div ngbDropdownMenu aria-labelledby="startDateDropdown">
        <div style="width: 360px">
          <dl-date-time-picker
            [(ngModel)]="startDate"
            (change)="startDateSelected($event)"
            minuteStep="15"
          >
          </dl-date-time-picker>
        </div>
      </div>
    </div>
  </div>
</div>
<div class="input-group">
  <input
    id="endDate"
    type="text"
    class="form-control"
    aria-label="End date"
    dlDateTimeInput
    [ngModel]="endDate"
  />
  <div ngbDropdown class="d-inline-block">
    <div class="input-group-append">
      <button
        class="btn btn-outline-primary"
        id="endDateDropdown"
        ngbDropdownToggle
      >
        <i class="oi oi-calendar"></i>
      </button>
      <div ngbDropdownMenu aria-labelledby="endDateDropdown">
        <div style="width: 360px">
          <dl-date-time-picker
            [(ngModel)]="endDate"
            (change)="endDateSelected($event)"
            minuteStep="15"
          >
          </dl-date-time-picker>
        </div>
      </div>
    </div>
  </div>
</div>

我试图用这个关闭下拉菜单:

import { ViewChild } from "@angular/core";
import { NgbDropdown } from "@ng-bootstrap/ng-bootstrap";

[...]

export class ParentComponent {
  @ViewChild(NgbDropdown)
  private dropdown: NgbDropdown;

  public startDateSelected(event: DlDateTimePickerChange<Date>): void {
    this.startDatePicked.emit(event.value);
    this.dropdown.close();
  }

  public endDateSelected(event: DlDateTimePickerChange<Date>): void {
    this.endDatePicked.emit(event.value);
    this.dropdown.close();
  }
}

The Problem

问题是只有第一个下拉菜单关闭了,第二个没有。

如何同时关闭开始下拉菜单和结束下拉菜单?

要关闭所有下拉菜单,您需要使用 ViewChildren,而不是 ViewChild。这将 return 查询与选择器匹配的所有元素或指令。

@ViewChildren(NgbDropdown)
dropdowns: QueryList<NgbDropdown>;

startDateSelected(event: DlDateTimePickerChange<Date>): void {
  this.startDatePicked.emit(event.value);
  this.closeDrownDowns();
}

endDateSelected(event: DlDateTimePickerChange<Date>): void {
  this.startDatePicked.emit(event.value);
  this.closeDrownDowns();
}

private closeDropDowns() {
  this.dropdowns?.forEach(x => x.close());
}