单击 ngbDropdownMenu 内部时,@ng-bootstrap ngbDropdown 正在关闭
@ng-boostrap ngbDropdown is closing when clicking inside of the ngbDropdownMenu
我有一个 ngbDropdown
是我直接从 here 处理的。当我在我的 Angular 应用程序中使用它时,单击这些输入中的任何一个都会导致下拉菜单关闭,从而无法填写表格。当我在上面链接的 Bootstrap 网站上尝试这个时,它工作得很好,所以这显然只在我的应用程序中发生。
<div ngbDropdown class="d-inline-block">
<button class="btn btn-outline-primary" id="dropdownForm1" ngbDropdownToggle>Toggle
dropdown</button>
<div ngbDropdownMenu aria-labelledby="dropdownForm1">
<form class="px-4 py-3">
<div class="form-group">
<label for="exampleDropdownFormEmail1">Email address</label>
<input type="email" class="form-control" id="exampleDropdownFormEmail1"
placeholder="email@example.com">
</div>
<div class="form-group">
<label for="exampleDropdownFormPassword1">Password</label>
<input type="password" class="form-control" id="exampleDropdownFormPassword1"
placeholder="Password">
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="dropdownCheck">
<label class="form-check-label" for="dropdownCheck">
Remember me
</label>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
<div class="dropdown-divider"></div>
<button ngbDropdownItem>New around here? Sign up</button>
<button ngbDropdownItem>Forgot password?</button>
</div>
</div>
当我尝试调试我的应用程序中的问题时,我可以看到它关闭的原因是 @ng-bootstrap
库中的这段代码,即 _setCloseHandlers()
中的 运行 ] 在 ngbDropdown
class 本身。
ngbAutoClose(this._ngZone, this._document, this.autoClose, function () { return _this.close(); }, this._closed$, this._menu ? [this._menuElement.nativeElement] : [], this._anchor ? [this._anchor.getNativeElement()] : []);
此方法的最后一个参数是 ignoredElements
数组,bootstrap 检查此元素内是否发生了点击,如果是,则不会关闭下拉列表。请参阅下面的代码:
你可以在这里看到,如果 "element"(在我的例子中是下拉列表中的 <input />
)包含在任何 "ignoredElements" 中,那么它应该 return "false" 因此不关闭下拉菜单。现在,传入的唯一被忽略的元素是 ngbDropdownToggle
元素,它是 ngbDropdownMenu
的兄弟元素。如此正确,代码按预期工作,我们在这里不 return false 而是代码进行到最终 else
条件,即 return 为真。话虽如此,我完全希望 Bootstrap 网站上的下拉菜单以完全相同的方式运行,但事实并非如此!我看不到那个站点上的源代码,所以我不能在那个站点上像这样调试它,但是在我启动一个全新的 Angular 应用程序来测试它之前,我想我会在这里问。
你看过文档了吗?
https://ng-bootstrap.github.io/#/components/dropdown/api
在你的 ngbDropdown 指令旁边设置:autoClose="outside"。
哇哦!我完全没有意识到这只是在 4 月 4 日由团队修复的。我使用的是 v4.1.1,修复是在 v4.1.3 中添加的。
在此之后甚至还有第二次提交,将代码重构为一个方法。
我有一个 ngbDropdown
是我直接从 here 处理的。当我在我的 Angular 应用程序中使用它时,单击这些输入中的任何一个都会导致下拉菜单关闭,从而无法填写表格。当我在上面链接的 Bootstrap 网站上尝试这个时,它工作得很好,所以这显然只在我的应用程序中发生。
<div ngbDropdown class="d-inline-block">
<button class="btn btn-outline-primary" id="dropdownForm1" ngbDropdownToggle>Toggle
dropdown</button>
<div ngbDropdownMenu aria-labelledby="dropdownForm1">
<form class="px-4 py-3">
<div class="form-group">
<label for="exampleDropdownFormEmail1">Email address</label>
<input type="email" class="form-control" id="exampleDropdownFormEmail1"
placeholder="email@example.com">
</div>
<div class="form-group">
<label for="exampleDropdownFormPassword1">Password</label>
<input type="password" class="form-control" id="exampleDropdownFormPassword1"
placeholder="Password">
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="dropdownCheck">
<label class="form-check-label" for="dropdownCheck">
Remember me
</label>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
<div class="dropdown-divider"></div>
<button ngbDropdownItem>New around here? Sign up</button>
<button ngbDropdownItem>Forgot password?</button>
</div>
</div>
当我尝试调试我的应用程序中的问题时,我可以看到它关闭的原因是 @ng-bootstrap
库中的这段代码,即 _setCloseHandlers()
中的 运行 ] 在 ngbDropdown
class 本身。
ngbAutoClose(this._ngZone, this._document, this.autoClose, function () { return _this.close(); }, this._closed$, this._menu ? [this._menuElement.nativeElement] : [], this._anchor ? [this._anchor.getNativeElement()] : []);
此方法的最后一个参数是 ignoredElements
数组,bootstrap 检查此元素内是否发生了点击,如果是,则不会关闭下拉列表。请参阅下面的代码:
你可以在这里看到,如果 "element"(在我的例子中是下拉列表中的 <input />
)包含在任何 "ignoredElements" 中,那么它应该 return "false" 因此不关闭下拉菜单。现在,传入的唯一被忽略的元素是 ngbDropdownToggle
元素,它是 ngbDropdownMenu
的兄弟元素。如此正确,代码按预期工作,我们在这里不 return false 而是代码进行到最终 else
条件,即 return 为真。话虽如此,我完全希望 Bootstrap 网站上的下拉菜单以完全相同的方式运行,但事实并非如此!我看不到那个站点上的源代码,所以我不能在那个站点上像这样调试它,但是在我启动一个全新的 Angular 应用程序来测试它之前,我想我会在这里问。
你看过文档了吗?
https://ng-bootstrap.github.io/#/components/dropdown/api
在你的 ngbDropdown 指令旁边设置:autoClose="outside"。
哇哦!我完全没有意识到这只是在 4 月 4 日由团队修复的。我使用的是 v4.1.1,修复是在 v4.1.3 中添加的。
在此之后甚至还有第二次提交,将代码重构为一个方法。