Angular:如何在有多个下拉列表的 ng-bootstrap 下拉列表中检测切换状态

Yul*_*ale 4 toggle typescript bootstrap-4 ng-bootstrap angular

我最近问了这个问题,得到了很好的回答。

但我还有另一个问题:如何在有多个下拉列表的 ng-bootstrap 下拉列表中检测切换状态?

我尝试这样做时,它只返回 firstdropdown 的状态。我不能使用唯一的 id,因为它们不包含 'isopen()' 方法。

如何在有多个下拉列表的 ng-bootstrap 下拉列表中检测切换状态?

Eli*_*seo 11

为什么不使用(openChange)????见堆栈闪电战

<div #drop1 ngbDropdown (openChange)="checkDropDown($event,1)">
  <button class="btn btn-outline-primary" ngbDropdownToggle >Toggle-1</button>
  <div ngbDropdownMenu aria-labelledby="dropdownConfig">
    <button ngbDropdownItem>Action - 1</button>
    <button ngbDropdownItem>Another Action</button>
    <button ngbDropdownItem>Something else is here</button>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

注意:如果我们可以参考下拉菜单,我们写

<div #drop1="ngbDropdown" 
      ngbDropdown (openChange)="checkDropDown($event,drop1)">
....
</div>
checkDropDown(open:boolean,dropdown: NgbDropdown) {
    console.log(open,dropdown.placement)

}
Run Code Online (Sandbox Code Playgroud)

更新,ngbDropdown 的官方文档在这里。理解 API 可能很困难,因此,尝试简单地解释一下

输入是我们可以在 .html 中添加的属性

<div ngbDropdown [propertie]="variable"..>
//or
<div ngbDropdown propertie="valor" ...>
//if is a string, don't forget use simple quotes e.g.
<div ngbDropdown autoClose="'outside'" ...>
Run Code Online (Sandbox Code Playgroud)

输出子“事件”,如果返回一个值,我们使用 $event 获得响应,例如

<div ngbDropdown (openChange)="myFunction($event)" ...>
//If we can send more arguments, simply
<div ngbDropdown (openChange)="myFunction($event,"some more")" ...>
Run Code Online (Sandbox Code Playgroud)

方法是我们可以在 .ts 中使用的方法是我们有一个 ViewChild 或 ViewChildren

<div #myngbDropdown ngbDropdown [propertie]="variable"..>

@ViewChild('myngbDropDown') mydrop:nhbDropDown;

ngOnAtferView()
{
    console.log(this.mydrop.isOpen())
}
Run Code Online (Sandbox Code Playgroud)


Fed*_*one 6

我会做这样的事情:

我得到了所有的下拉菜单 ViewChildren

@ViewChildren(NgbDropdown)
dropdowns: QueryList<NgbDropdown>;
dropdown: NgbDropdown;
Run Code Online (Sandbox Code Playgroud)

然后我会checkDropDown以这种方式改变方法:

checkDropDown(dropdown: any) {
  // Check which dropdown was clicked
  this.dropdown = this.dropdowns.find(x => (x as any)._elementRef.nativeElement == dropdown)
  // Check if the clicked dropdown is open
  console.log(this.dropdown.isOpen())
}
Run Code Online (Sandbox Code Playgroud)

您也应该使用模板引用更改您的 html 文件:

<div #drop1 ngbDropdown>
<button class="btn btn-outline-primary" ngbDropdownToggle (click)="checkDropDown(drop1)">Toggle-1</button>

...

<div #drop2 ngbDropdown>
<button class="btn btn-outline-primary" ngbDropdownToggle (click)="checkDropDown(drop2)">Toggle-2</button>
Run Code Online (Sandbox Code Playgroud)

我也在这里放了一个可用的 StackBlitz

PS你的按钮有相同的ID,删除它们: dropdownConfig

  • 为什么不使用(openChange)????https://ng-bootstrap.github.io/#/components/dropdown/api (2认同)