导航栏下拉菜单不适用于 Angular 和 Bootstrap 4

Posted

技术标签:

【中文标题】导航栏下拉菜单不适用于 Angular 和 Bootstrap 4【英文标题】:Navbar drop-down menu not working with Angular and Bootstrap 4 【发布时间】:2018-08-09 21:03:05 【问题描述】:

我正在使用 Angular 5 和 Bootstrap 4 开发一个 Web 应用程序,但我遇到了导航菜单栏下拉菜单的问题。我正在关注文档https://getbootstrap.com/docs/4.0/components/navs/,但我不知道为什么下拉菜单不起作用!

<header>
    <div class = "row align-items-end nopadding">
        <div class = "col-md-3" style = "background-color: blanchedalmond"><app-logo></app-logo></div>
        <div class = "col-md-6">
            <ul class="nav justify-content-center">
                <li class="nav-item">
                    <a class="nav-link menu-item" href="#">Ligas</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link menu-item" href="#">Gráficas</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link menu-item" href="#">Artículos</a>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link menu-item dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Clasificaciones</a>      
                    <div class=" dropdown dropdown-menu">
                        <a class="dropdown-item menu-item" href="#">Equipos</a>
                        <a class="dropdown-item menu-item" href="#">Jugadoras</a>
                        <div class="dropdown-divider"></div>
                        <a class="dropdown-item" href="#">Separated link</a>
                    </div>
                </li>                
            </ul>
        </div>
        <div class = "col-md-3 right-content">
            Right column
        </div>
    </div>
</header>

我做错了什么?

编辑我:

我已经通过 npm 添加 jquery 和 popper,更新 muy angular-cli.json 并重启服务器:

angular-cli.json:

当我加载页面时出现此错误:

Error in the source mapping: request failed with status 404 
Resource URL: http://localhost:4200/ scripts.bundle.js 
Sourcemap URL: bootstrap.min.js.map

安装 jquery 后,我得到了以下输出:

当我安装 popper 时,我得到了这个输出:

我做错了什么?

【问题讨论】:

它对我有用。您是否能够在 JSfiddle 等中重现该问题? 如果您不使用 Angular 5,它可以工作,而 Angular 5 则无法工作。例如,您是否在标头组件中使用 Angular 5 测试过代码? 【参考方案1】:

首先使用命令行安装: npm install --save @ng-bootstrap/ng-bootstrap

添加这个: “./node_modules/bootstrap/dist/css/bootstrap.min.css” 在 styles 数组

内的 angular.json 文件中

最后,在 app.module.ts 文件中 导入下拉模块 从 'ngx-bootstrap/dropdown' 导入 BsDropdownModule ; 然后在“import”部分添加模块:BsDropdownModule.forRoot()

【讨论】:

【参考方案2】:

我遇到了同样的问题,我的解决方法是更改​​数据切换,在你的情况下,从:

<a class="nav-link menu-item dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Clasificaciones</a>      

收件人:

<a class="nav-link menu-item dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Clasificaciones</a>      

【讨论】:

【参考方案3】:

有用的是

    将此添加到我的 angular.json

"scripts": [
              "./node_modules/jquery/dist/jquery.min.js",
              "./node_modules/popper.js/dist/popper.min.js",
              "./node_modules/bootstrap/dist/js/bootstrap.min.js"
            ]
    将此添加到 index.html 的标头标记中

<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>

【讨论】:

【参考方案4】:

截至 2021 年 5 月 21 日,bootstrap 5.0.1 版本已经推出,这似乎是我遇到的问题。我切换回 4.6.0,一切又好了。

注意:如果您在 angular.json 中引用以下脚本和样式,则应该没问题。 bootstrap.bundle.min.js 已经绑定了 popper.js

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

【讨论】:

【参考方案5】:

我遇到了同样的问题并通过以下方式解决了它:

    npm install bootstrap --savestyles.css 中添加了以下行

@import "~bootstrap/dist/css/bootstrap.min.css";
    index.html 中添加了以下行

<!doctype html>
<html lang="en">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<head>
  <meta charset="utf-8">

......................

【讨论】:

【参考方案6】:

就我而言,问题是我没有使用角度特定的属性。 见:https://ng-bootstrap.github.io/#/components/dropdown/examples

ngbDropdownngbDropdownTogglengbDropdownMenungbDropdownItem

我必须改变

<li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" id="navbarScrollingDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
            Link
          </a>
          <ul class="dropdown-menu" aria-labelledby="navbarScrollingDropdown">
            <li><a class="dropdown-item" href="#">Action</a></li>
            <li><a class="dropdown-item" href="#">Another action</a></li>
            <li><hr class="dropdown-divider"></li>
            <li><a class="dropdown-item" href="#">Something else here</a></li>
          </ul>
        </li>

到:

<li class="nav-item dropdown" ngbDropdown>
            <a class="nav-link dropdown-toggle" id="navbarScrollingDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false" ngbDropdownToggle>
              Link
            </a>
            <ul class="dropdown-menu"  ngbDropdownMenu aria-labelledby="navbarScrollingDropdown">
              <li ngbDropdownItem><a class="dropdown-item" href="#">Action</a></li>
              <li ngbDropdownItem><a class="dropdown-item" href="#">Another action</a></li>
              <li ngbDropdownItem><hr class="dropdown-divider"></li>
              <li ngbDropdownItem><a class="dropdown-item" href="#">Something else here</a></li>
            </ul>
          </li>

【讨论】:

这看起来是最 Angular 的方式。 为我工作,谢谢【参考方案7】:

我遇到了同样的问题,但我设法找到了解决方案,如果您的项目有引导程序,那么简单的解决方案就是改变

<a class="dropdown-toggle" data-toggle="dropdown" href="#">Page 1
        <span class="caret"></span></a>

<a class="dropdown-toggle" data-toggle="dropdown" href='target="_self"'>Page 1
        <span class="caret"></span></a>

简而言之,将href="#" 更改为href='target="_self"'

【讨论】:

【参考方案8】:

确保您已在根文件夹中安装 jquery

如果没有,则使用 NPM 安装 ---> npm install jquery --save

注意:如果您想在您的应用程序中使用引导程序,或者如果您已经在您的项目中使用,请确保在包含引导程序 javascript 文件之前包含 jQuery。 Bootstrap 的 JavaScript 文件需要 jQuery

转到 Angular CLI 项目文件夹根目录下的 angular.json 文件,找到 scripts: [ ] 属性,并包含 jQuery 的路径,如下所示:

"scripts": [ "node_modules/jquery/dist/jquery.min.js",
          "node_modules/bootstrap/dist/js/bootstrap.js"
       ]

【讨论】:

【参考方案9】:

我不允许对 WebDevBooster 的答案添加评论,所以我发布了一条新评论。 angular.json (angular-cli.json) 中的下一个声明就足够了:

"scripts": [
          "node_modules/jquery/dist/jquery.min.js",
          "node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"
        ]

propper.js 已经包含在 bootstrap.bundle.min.js 中:https://getbootstrap.com/docs/4.4/components/dropdowns/#overview

【讨论】:

bootstrap.bundle.min.js 是一个棘手的问题。我没有意识到这一点。谢谢。 这似乎目前不起作用。任何想法为什么?【参考方案10】:

不要在脚本中添加 popper、jquery 依赖项,而是尝试安装 ng-bootstrap(在 https://ng-bootstrap.github.io 中查找文档)。 使用 ng-bootstrap 相对于添加 bootstrap、jquery 和 popper 脚本的优势 它不会膨胀你的包大小吗?出于这些原因,Angular 社区创建了 ng-bootstrap。 安装步骤:

    npm install --save @ng-bootstrap/ng-bootstrap 安装后,您需要导入我们的主模块。

【讨论】:

如果您已经在使用像primeng这样的不同组件库但又想使用引导导航库,这将是一个问题。 在我从我的 Angular 项目中删除带有 npm 的引导程序,然后通过 ng-bootstrap 重新安装之前,我确实在使这个下拉菜单工作时遇到了很多麻烦。该组件的模板标记需要进行少量编辑才能将一些引导类转换为 ng 指令,然后它就可以完美地工作了。【参考方案11】:

除了app.module.ts,您还需要在您放置导航条码的模块中导入模块MDBBootstrapModule.forRoot()

示例: ../custom.module.ts

import  MDBBootstrapModule  from 'angular-bootstrap-md';
...
@NgModule(
  imports: [
    CommonModule,
    MDBBootstrapModule.forRoot()
  ],
...

【讨论】:

【参考方案12】:

您必须确保 popper.js 包含并加载到您的 Angular 应用程序中,因为这是 Bootstrap 4 中弹出或下拉的所有内容所必需的。

angular-cli.json 的相关部分如下所示:

"styles": [
"../node_modules/bootstrap/dist/css/bootstrap.min.css",
"styles.css"
],
"scripts": [
"../node_modules/jquery/dist/jquery.min.js",
"../node_modules/popper.js/dist/umd/popper.min.js",
"../node_modules/bootstrap/dist/js/bootstrap.min.js"
],

要安装 popper.js,请使用以下命令:

npm install popper.js --save

参考:https://www.npmjs.com/package/popper.js

【讨论】:

这通常应该在 bootstrap.min.js 之前立即加载查看这个问题中的 angular-cli.json:***.com/q/48362985/8270343 npm install popper.js --save 是您所需要的:npmjs.com/package/popper.js 有效!!!我觉得我要哭了!!! :) 非常感谢您的帮助!!! 注意:确保jQuery的引用在bootstrap.js之前。 就我而言, Dropdown 将 data-toggle 更改为 data-bs-toggle 开始正常工作。希望对您有所帮助。

以上是关于导航栏下拉菜单不适用于 Angular 和 Bootstrap 4的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bootstrap 4 和 Angular 7 在导航栏中制作多级下拉菜单

Angular UI Bootstrap 响应式导航栏下拉菜单在新版本中无法正常工作

标题导航栏的下拉列表不适用于页面选项卡

Angular4更改子组件中的导航栏值

双击导航栏的下拉菜单。

导航菜单 - 不适用于 IE