【问题标题】:Bootstrap dropdown with Angular 6使用 Angular 6 的引导下拉菜单
【发布时间】:2018-12-03 10:18:24
【问题描述】:

我正在尝试使用 Angular 6 在 Bootstrap 导航栏中创建一个下拉项。当我在线测试时,我的代码正在运行:

<nav class="navbar bg-light navbar-light navbar-expand">
<ul class="navbar-nav">
  <li class="nav-item dropdown" >
    <a class="nav-link dropdown-toggle" data-toggle="dropdown">Page1</a>
    <div class="dropdown-menu">
      <a class="dropdown-item" href="#">Page1.1</a>
    </div>
  </li>
  <li><a class="nav-link" href="#">Page2</a></li>
</ul>
</nav>

但下拉菜单不适用于 Angular 6。我使用以下方法将 Bootstrap 与 Angular 一起使用:

ng add @ng-bootstrap/schematics

除了那个下拉项之外,一切都很好!

【问题讨论】:

  • 您能告诉我您使用的是哪个版本的引导程序吗?
  • 还请您在angular.json文件的样式数组中添加“node_modules/bootstrap/dist/css/bootstrap.min.css”
  • 您可以尝试使用角度下拉菜单代替引导程序。您可以参考以下链接。多功能npmjs.com/package/@ng-select/ng-select

标签: angular drop-down-menu bootstrap-4 ng-bootstrap


【解决方案1】:

我之前也遇到过同样的问题,发现如下:

  1. html 应该与 Bootstrap Layout 中提到的引导程序中的类 container 绑定
  2. 下拉菜单建立在第三方库Popper.js 上,如Bootstrap Dropdown 中所述

据我所知,您没有参考所需的javascript,即util.js, bootstrap.js, popper.js 或缩小版。

这里,我什么都没做,只是在索引文件中引用需要的javascript文件

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

我创建了一个导航组件并根据需要进行设计,如下所示:

<div class="container">
    <!-- Content here -->
    <ul class="nav nav-pills">
        <li class="nav-item">
            <a class="nav-link active" href="#">Active</a>
        </li>
        <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
            <div class="dropdown-menu">
                <a class="dropdown-item" href="#">Action</a>
                <a class="dropdown-item" href="#">Another action</a>
                <a class="dropdown-item" href="#">Something else here</a>
                <div class="dropdown-divider"></div>
                <a class="dropdown-item" href="#">Separated link</a>
            </div>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item">
            <a class="nav-link disabled" href="#">Disabled</a>
        </li>
    </ul>
</div

可以在here 找到工作演示。希望对您有所帮助。

【讨论】:

  • "html 应该与类容器绑定" 就是这样!谢谢
  • 第二步(添加 3 个库)对我有用。非常感谢!
【解决方案2】:

我遇到了同样的引导问题,但我得到了解决方案。 如果您使用的是 Angular 6,则无需添加 popper.js 进行引导。您需要添加 bootstrap 4,然后添加 rxjs-compat

npm install rxjs-compat

并添加 ngx-bootstrap 以执行下拉操作。安装 ngx-bootstrap,

npm install ngx-bootstrap --save

现在我们需要使用以下代码在您的应用程序中添加来自 ngx-bootstrap 的下拉模块

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
import { TooltipModule } from 'ngx-bootstrap/tooltip';
import { ModalModule } from 'ngx-bootstrap/modal';
import { AppComponent } from './app.component';

@NgModule({
 declarations: [
   AppComponent
 ],
 imports: [
   BrowserModule,
   CommonModule,
   BsDropdownModule.forRoot(),
   TooltipModule.forRoot(),
   ModalModule.forRoot()
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }

然后我对您的代码进行了一些更改,它对我来说工作正常。

<nav class="navbar navbar-default">
<ul class="nav navbar-nav">
  <li class="dropdown" dropdown >
    <a dropdownToggle role="button"> <!-- {2} -->
        Page1<span class="caret"></span></a>
    <div *dropdownMenu class="dropdown-menu">
      <a class="dropdown-item" href="#">Page1.1</a>
    </div>
  </li>
  <li><a class="nav-link" href="#">Page2</a></li>
</ul>
</nav>

【讨论】:

  • 为什么添加rxjs-compat?对我来说,没有它就可以了。
【解决方案3】:

@Rushikesh Salunke 的答案很好,但在我看到它的时候,我已经在使用@ng-bootstrap 库,而不是 ngx,这就是我从docs 中找到的。

首先,将 NgbDropdown 模块导入到你要使用的组件中。

import { NgbDropdown} from '@ng-bootstrap/ng-bootstrap';

然后修改你的.html如下:

<div ngbDropdown class="d-inline-block">
  <button class="btn btn-outline-primary" id="dropdownBasic1" ngbDropdownToggle>Toggle dropdown</button>
  <div ngbDropdownMenu aria-labelledby="dropdownBasic1">
    <button class="dropdown-item">Action - 1</button>
    <button class="dropdown-item">Another Action</button>
    <button class="dropdown-item">Something else is here</button>
  </div>
</div>

您可以查看其他用例here

【讨论】:

    【解决方案4】:

    给你...

    我做了以下更改 -

    1. app.component.html

    <p>
      Start editing to see some magic happen :)
    </p>
    <nav class="navbar bg-light navbar-light navbar-expand">
    <ul class="nav navbar-nav">
      <li class="dropdown" appDropdown>
        <a href="#" class="dropdown-toggle" role="button">Page1</a>
        <ul class="dropdown-menu">
          <li><a href="#">Page1.1</a></li>
          <li><a href="#">Page1.2</a></li>
          <li><a href="#">Page1.3</a></li>
        </ul>
      </li>
      <li><a class="nav-link" href="#">Page2</a></li>
    </ul>
    </nav>
    

    2。 app.module.ts

    我添加了一个指令来监听下拉菜单的点击事件并在 app.module.ts 中导入相同的指令

    import { NgModule } from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { FormsModule } from '@angular/forms';
    
    import { AppComponent } from './app.component';
    import { HelloComponent } from './hello.component';
    
    import { DropdownDirective } from './dropdown.directive';
    
    @NgModule({
      imports:      [ BrowserModule, FormsModule ],
      declarations: [ AppComponent, HelloComponent, DropdownDirective ],
      bootstrap:    [ AppComponent ]
    })
    export class AppModule { }
    

    3. dropdown.directive.ts

    添加了监听点击事件的指令

    import { Directive, HostListener, ElementRef, Renderer2 } from "@angular/core";
    
    @Directive({
      selector: '[appDropdown]'
    })
    
    export class DropdownDirective {
      manageDropdown : boolean = false;
    
      constructor(private elementRef: ElementRef, private renderer: Renderer2)   {
    
      }
    
      @HostListener('click') openDropdown(eventData: Event) {
        if(!this.manageDropdown) {
          this.renderer.addClass(this.elementRef.nativeElement,'open');
          this.manageDropdown = !this.manageDropdown;
        } else {
          this.renderer.removeClass(this.elementRef.nativeElement, 'open');
          this.manageDropdown = !this.manageDropdown;
        }
      }
    }
    

    4. angular.json

    要求您执行“npm install --save bootstrap@3”并在 angular.json 文件中进行以下更改。

    "styles": [
                  "src/styles.css",
                  "../node_modules/bootstrap/dist/css/bootstrap.min.css"
                ],
                "scripts": [
                  "../node_modules/bootstrap/dist/js/bootstrap.min.js"
                ]
    

    注意 - 供您参考,请访问reference 链接。您可以查看下拉演示。

    【讨论】:

    • 请使用 bootstrap 4,因为这是问题中的版本。
    【解决方案5】:

    当你做对了所有事情并按照给出的示例进行操作时,它似乎不起作用,可能是你忘记导入 Bootstrap 模块。

    您可以通过此行对您打算在其中使用该组件的主模块执行此操作:

    import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
    
    @NgModule({
      declarations: [MyComponent],
      imports: [
        NgbModule
      ],
      exports: [MyComponent]
    })
    

    【讨论】:

      【解决方案6】:
      <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
      integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
      crossorigin="anonymous"></script>
      
      
      <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
      integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
      crossorigin="anonymous"></script>
      
      
      <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
      integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
      crossorigin="anonymous"></script>
      

      在 index.html 中在关闭 body 标记之前添加它。这对我有用。

       <ul class="navbar-nav navbar-right">
              <li class="nav-item dropdown">
                  <a class="nav-link dropdown-toggle" role="button" data-toggle="dropdown" aria-haspopup="true"
                      aria-expanded="false">
                      Manage Data
                  </a>
                  <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                      <a class="dropdown-item" href="">Save Data</a>
                      <a class="dropdown-item" href="">Fetch Data</a>
                  </div>
              </li>
          </ul>
      

      【讨论】:

        【解决方案7】:

        第一步:安装 ng-bootstrap

        ng add @ng-bootstrap/ng-bootstrap
        

        第 2 步:将 ng-bootstrap 模块添加到您的组件模块文件中

        import { NgModule } from '@angular/core';
        import { BrowserModule } from '@angular/platform-browser';
        import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
        
        ...
        
        @NgModule({
          imports: [BrowserModule, NgbModule],
          ...
        })
        
        

        第 3 步:在您的组件视图文件中添加以下代码:

        <div class="col">
            <div ngbDropdown class="d-inline-block">
              <button class="btn btn-outline-primary" id="dropdownBasic1" ngbDropdownToggle>Toggle dropdown</button>
              <div ngbDropdownMenu aria-labelledby="dropdownBasic1">
                <button ngbDropdownItem>Action - 1</button>
                <button ngbDropdownItem>Another Action</button>
                <button ngbDropdownItem>Something else is here</button>
              </div>
            </div>
          </div>
        

        参考:ng-bootstrap Docs

        【讨论】:

          【解决方案8】:

          对于正在使用 bootstrap 4.4.1 和 Angular 9+ 寻找解决方案的任何人,我通过使用以下主机侦听器创建自定义指令来解决。只是将 show 添加到父 li 并没有做任何事情

           @HostListener('click', ['$event']) onClick(event) {
                   if (this.el.nativeElement.classList.contains('show')) {
                      this.renderer.removeClass(this.el.nativeElement, 'show');
                      this.renderer.setAttribute(this.el.nativeElement.childNodes[0], 'aria-expanded', 'false')
                      this.renderer.removeClass(this.el.nativeElement.childNodes[1], 'show')
          
                  } else {
                      this.renderer.addClass(this.el.nativeElement, 'show')
                      this.renderer.setAttribute(this.el.nativeElement.childNodes[0], 'aria-expanded', 'true')
                      this.renderer.addClass(this.el.nativeElement.childNodes[1], 'show')
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 2012-07-05
            • 2015-08-08
            • 2020-05-25
            • 2019-07-16
            • 2021-09-04
            • 1970-01-01
            • 2023-03-23
            相关资源
            最近更新 更多