设置动态类时,ngx-bootstrap下拉对齐不起作用

时间:2018-04-15 10:54:44

标签: angular dropdown ngx-bootstrap

我对ngx-bootstrap(使用bootstrap 4.1)下拉组件有一个奇怪的问题。

我将下拉菜单设置为通过变量向右对齐,但是,当我这样做时,下拉列表仅在第二次点击时对齐。

以下是复制问题的示例代码:

<div class="btn-group" dropdown placement="bottom right">
    <button dropdownToggle type="button" class="btn btn-primary dropdown-toggle">
      This dropdown's menu is right-aligned <span class="caret"></span>
    </button>
    <ul *dropdownMenu class="dropdown-menu" [ngClass]="{'dropdown-menu-right': true}" role="menu">
      <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>
      <li class="divider dropdown-divider"></li>
      <li role="menuitem"><a class="dropdown-item" href="#">Separated link</a></li>
    </ul>
</div>

注意:我动态设置属性的[ngClass]是导致问题的原因,如果我将它静态地放在类定义中,它可以正常工作。

以下是一个复制的Plunker示例: https://plnkr.co/edit/5OrrQx0uefrWxWBliJDL?p=preview

4 个答案:

答案 0 :(得分:2)

如果你在调试器中查看生成的html,你会看到ul包含你的dropdown-menu-right类和一些内联样式,它们会覆盖定位(第一次打开它) 。这些内联样式可能是由库添加的。

<ul class="dropdown-menu show dropdown-menu-right" 
role="menu" ng-reflect-klass="dropdown-menu" 
ng-reflect-ng-class="[object Object]" 
style="left: 0px; right: auto; top: 100%; transform: translateY(0px);">

也许你应该把这个问题带到图书馆维护者的github。作为解决方法,您可以尝试将此css添加到全局CSS文件

.dropdown-menu-right {
    right: 0 !important;
    left: auto !important; 
}

除了有important规则

之外,这与该类默认定义的样式相同

Your plunker edited(在index.html中使用样式)

答案 1 :(得分:0)

尝试使用单引号' [ngClass]="'{dropdown-menu-right: true}'"包裹整个表达式 而不是[ngClass]="{'dropdown-menu-right': true}"

答案 2 :(得分:0)

是的,我认为这是某种ngx-bootstrap生命周期错误。

为我解决的是以下丑陋的“模板魔术”(popupLeft是我的布尔值,它确定是否应添加dropdown-menu-right

  <ng-template *ngIf="popupLeft" dropdownMenu>
    <ul class="dropdown-menu dropdown-menu-right" role="menu">
      <ng-container *ngTemplateOutlet="dropdownMenuContents"></ng-container>
    </ul>
  </ng-template>
  <ng-template *ngIf="!popupLeft" dropdownMenu>
    <ul class="dropdown-menu" role="menu">
      <ng-container *ngTemplateOutlet="dropdownMenuContents"></ng-container>
    </ul>
  </ng-template>
  <ng-template #dropdownMenuContents>
    <li class="dropdown-item">
      <!-- ... -->
    </li>
  </ng-template>

答案 3 :(得分:0)

要使 placement="bottom right" 工作,您还应该添加 container="body"

这应该有效:

<div class="btn-group" dropdown container="body" placement="bottom right">
    <button dropdownToggle type="button" class="btn btn-primary dropdown-toggle">
      This dropdown's menu is right-aligned <span class="caret"></span>
    </button>
    <ul *dropdownMenu class="dropdown-menu" [ngClass]="{'dropdown-menu-right': true}" role="menu">
      <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>
      <li class="divider dropdown-divider"></li>
      <li role="menuitem"><a class="dropdown-item" href="#">Separated link</a></li>
    </ul>
</div>