引导程序汉堡菜单无法打开

3

我已经按照逐步过程实现了汉堡包在导航栏中的应用。然而,在调整窗口大小时,导航栏会收缩,但是单击它时并不会打开。

请参考以下示例代码。我使用的是bootstrap4和angular 6版本。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>


<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

<nav class="navbarc navbar-expand-lg navbar-dark shadow-sm p-3 mb-5 rounded navbar-fixed-top" style="padding: 0.5rem !important;
margin-bottom: .5rem !important; border-radius: 4px;
 padding: 05px;">

    <button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
      <span class="icon-bar"></span> 
    </button>
    <div class="collapse navbar-collapse" id="navbarNavDropdown">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item">
                <a class="nav-links" style="font-size: 16px;" routerLink="">Special Discount <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
                <a class="nav-links" style="font-size: 16px;" routerLink="Products">Products on Discount</a>
            </li>

        </ul>
    </div>
</nav>

angular.json
{
    "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
    "version": 1,
    "newProjectRoot": "projects",
    "projects": {
        "myapp": {
            "root": "",
            "sourceRoot": "src",
            "projectType": "application",
            "prefix": "app",
            "schematics": {},
            "architect": {
                "build": {
                    "builder": "@angular-devkit/build-angular:browser",
                    "options": {
                        "outputPath": "dist/myapp",
                        "index": "src/index.html",
                        "main": "src/main.ts",
                        "polyfills": "src/polyfills.ts",
                        "tsConfig": "src/tsconfig.app.json",
                        "assets": [
                            "src/favicon.ico",
                            "src/assets"
                        ],
                        "styles": [
                            "node_modules/bootstrap/dist/css/bootstrap.min.css",
                            "src/styles.css"
                        ],
                        "scripts": [
                            "node_modules/jquery/dist/jquery.min.js",
                            "node_modules/popper.js/dist/popper.min.js",
                            "node_modules/popper.js/dist/umd/popper.min.js",
                            "node_modules/bootstrap/dist/js/bootstrap.min.js"
                        ],
                        "es5BrowserSupport": true
                    },
                    "configurations": {
                        "production": {
                            "fileReplacements": [{
                                "replace": "src/environments/environment.ts",
                                "with": "src/environments/environment.prod.ts"
                            }],
                            "optimization": true,
                            "outputHashing": "all",
                            "sourceMap": false,
                            "extractCss": true,
                            "namedChunks": false,
                            "aot": true,
                            "extractLicenses": true,
                            "vendorChunk": false,
                            "buildOptimizer": true,
                            "budgets": [{
                                "type": "initial",
                                "maximumWarning": "2mb",
                                "maximumError": "5mb"
                            }]
                        }
                    }
                },

package.json -
{
    "name": "myapp",
    "version": "0.0.0",
    "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
    },
    "private": true,
    "dependencies": {
        "@angular/animations": "^7.2.15",
        "@angular/cdk": "^6.1.0",
        "@angular/cli": "^6.1.3",
        "@angular/common": "~7.2.0",
        "@angular/compiler": "~7.2.0",
        "@angular/core": "^7.2.15",
        "@angular/forms": "~7.2.0",
        "@angular/material": "^6.1.0",
        "@angular/platform-browser": "~7.2.0",
        "@angular/platform-browser-dynamic": "~7.2.0",
        "@angular/router": "~7.2.0",
        "angular-user-idle": "^2.1.4",
        "bootstrap": "^4.3.1",
        "chart.js": "^2.5.0",
        "core-js": "^2.5.4",
        "forms": "^1.3.1",
        "hammerjs": "^2.0.8",
        "jquery": "^3.3.1",
        "ng-recaptcha": "^5.0.0",
        "ngx-logger": "^4.0.3",
        "npm": "^6.11.3",
        "popper.js": "^1.14.7",
        "rxjs": "~6.3.3",
        "tslib": "^1.9.0",
        "zone.js": "~0.8.26"
    },
    "devDependencies": {
        "@angular-devkit/build-angular": "~0.13.0",
        "@angular/compiler-cli": "~7.2.0",
        "@angular/language-service": "~7.2.0",
        "@types/jasmine": "~2.8.8",
        "@types/jasminewd2": "~2.0.3",
        "@types/node": "~8.9.4",
        "codelyzer": "~4.5.0",
        "jasmine-core": "~2.99.1",
        "jasmine-spec-reporter": "~4.2.1",
        "karma": "~4.0.0",
        "karma-chrome-launcher": "~2.2.0",
        "karma-coverage-istanbul-reporter": "~2.0.1",
        "karma-jasmine": "~1.1.2",
        "karma-jasmine-html-reporter": "^0.2.2",
        "protractor": "~5.4.0",
        "ts-node": "~7.0.0",
        "tslint": "~5.11.0",
        "typescript": "~3.2.2"
    }
}

我希望在单击事件中显示导航栏内容的汉堡包菜单。 请帮助我理解我哪里出错了。 任何线索都将非常有帮助。

你把那些 script 元素添加在哪里了?Angular 会从模板中剥离这些元素。你应该将这两个 URL 添加到 angular.json 文件的 scripts 数组中。 - David Fontes
你能否重现这个问题?对我来说,它运行良好:https://codesandbox.io/s/youthful-dew-jy62k - Cereal
@David,参考已经在angular.json的scripts数组中了。请参考以下片段。------"scripts": [ "./node_modules/jquery/dist/jquery.min.js", "./node_modules/popper.js/dist/popper.min.js", "./node_modules/popper.js/dist/umd/popper.min.js", "./node_modules/bootstrap/dist/js/bootstrap.min.js" ], "es5BrowserSupport": true - user3794867
@Cereal,我不理解,为什么汉堡在“codesandbox”运行正常而在我的项目中却不行? - user3794867
@user3794867它能够工作是因为他直接在HTML文件中导入了依赖项。如果您在自己的端上也这样做,可能也会起作用,但这可能会有一些注意事项,因为这不是在您的Angular应用程序中包含文件的推荐方式。 - David Fontes
5个回答

1

Bootstrap 4与Angular存在一些已知问题,包括导航栏组件。因此,如果您想在Angular中使用Bootstrap,我建议使用@ng-bootstrap/ng-bootstrapngx-bootstrap包,因为它们是最受欢迎的包之一。

如果您想使用自己的实现,可以按照以下步骤进行修复:

  1. 在模板文件中的按钮元素上添加一个点击事件监听器。
<button (click)="toggleNavbarCollapse()">Your icon here</button>

2. 为组件添加一个属性来跟踪导航栏的状态,并添加一个方法来切换其值。
navbarCollapsed = true;

toggleNavbarCollapse() {
  this.navbarCollapsed = !this.navbarCollapsed;
}
  1. 从具有类 navbar-collapsediv 中删除 collapse 类。
  2. 根据 navbarCollapsed 属性动态添加 collapse 类。
<div [ngClass]="{ collapse: navbarCollapsed }">...</div>

您可以在演示中查看更多信息。


1
您可能缺少引用:
 <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" ></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" ></script>

谢谢@SemBauke的及时回复。正如您建议的那样,我已经在HTML中包含了引用,并在package.json中更正了它们的版本。但是汉堡包没有打开。请问我还有什么遗漏吗? - user3794867

1
Bootstrap 4.3.1目前依赖于JQuery 3.3.1,而不是3.4版本,并包含了popper。
正如Bootstrap文档所述。
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" ></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

看起来有些变化了...尝试使用input属性...让我们看看

`
"styles": [{
                "input": "src/theme/variables.scss"
              },
              {
                "input": "src/global.scss"
              },
              {
                "input": "node_modules/bootstrap/dist/css/bootstrap.min.css"
              }
            ],
            "scripts": [{
                "input": "node_modules/jquery/dist/jquery.min.js"
              },
              {
                "input": "node_modules/popper.js/dist/esm/popper.min.js"
              },
              {
                "input": "node_modules/bootstrap/dist/js/bootstrap.min.js"
              }
~

正如您建议的那样,我在我的HTML和package.json文件中更正了jQuery和Popper版本。但问题仍然存在。这里还有其他可能遗漏的东西吗? - user3794867
应该在 angular.json 文件中,而不是 package.json 中。 - AbdulAzeez Olanrewaju
angular.json 文件包含脚本数组,其中包括以下内容 -- "scripts": [ "./node_modules/jquery/dist/jquery.min.js", "./node_modules/popper.js/dist/popper.min.js", "./node_modules/popper.js/dist/umd/popper.min.js", "./node_modules/bootstrap/dist/js/bootstrap.min.js" ], - user3794867
1
也许你应该在 index.html 文件中添加 CDN。保持酷炫! - AbdulAzeez Olanrewaju
解决了,经过4个小时的努力终于成功了。谢谢!! - user3794867
显示剩余6条评论

1

我编辑了您的导航栏,现在应该可以正常使用。如果您有其他问题,请随时提问。

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="#">Your site name</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarNavDropdown">
        <ul class="navbar-nav">
            <li class="nav-item active">
                <a class="nav-link" href="#">Special Discounts </a>
            </li>
            <li class="nav-item active">
                <a class="nav-link" href="#">Products on Discount</a>
            </li>
        </ul>
    </div>
</nav>

请注意,您的参考文献必须包含在内。

非常感谢您编辑代码来解决问题,但它仍然无法工作。我根据您的建议执行了以下步骤:1)为推荐版本的popper和jquery进行了npm安装。2)我的angular.json中的scripts数组包含----"./node_modules/jquery/dist/jquery.min.js", "./node_modules/popper.js/dist/popper.min.js", "./node_modules/popper.js/dist/umd/popper.min.js", "./node_modules/bootstrap/dist/js/bootstrap.min.js"], header.html包含您建议的引用在<head>标签内。 - user3794867

0

我查看了给定的链接,但仍然无法正常工作。 - user3794867
你能分享一下你的代码库吗? - Diogo Ferraz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接