折叠在导航栏面包屑按钮的 ng-bootstrap 和 Angular 4 应用程序中不起作用

Posted

技术标签:

【中文标题】折叠在导航栏面包屑按钮的 ng-bootstrap 和 Angular 4 应用程序中不起作用【英文标题】:Collapse not working in ng-bootstrap and angular 4 app for navbar breadcrumb button 【发布时间】:2018-04-24 00:16:18 【问题描述】:

我正在为我的应用程序使用 angular 4 和 bootstrap 4 beta 2 和 ng-bootstrap,并且还使用 ng-bootstrap。

我已经从引导文档示例中添加了导航栏。

代码如下所示:

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="#">Navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02" aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
    <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </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>
    <form class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="search" placeholder="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>

我还在 angular-cli.json 中添加了引导样式。该代码如下所示:

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

移动视图上的面包屑导航按钮在单击时没有响应。当我尝试检查相同的内容时:我知道“折叠”类没有被添加到单击按钮中。

【问题讨论】:

好像忘记添加 JQuery/bootstrap.js 我正在使用不需要 jquery 的 ng-bootstrap 【参考方案1】:

我现在有一个解决方案。只需使用 ng-bootstrap 即可解决您的问题。

html 文件:

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="#">Navbar</a>
  <button class="navbar-toggler btn btn-outline-primary" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"  aria-expanded="false" aria-label="Toggle navigation" (click)="isCollapsed = !isCollapsed" [attr.aria-expanded]="!isCollapsed" aria-controls="navbarTogglerDemo02">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarTogglerDemo02" [ngbCollapse]="isCollapsed">
    <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </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>
    <form class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="search" placeholder="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>

组件ts文件:

export class AppComponent 
  isCollapsed = false;

在 angular-cli.json 中添加引导 css 文件:

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

在主模块中添加:

import NgbModule from '@ng-bootstrap/ng-bootstrap';

imports: [
  NgbModule.forRoot()
]

这就像一个魅力。

使用 ng-bootstrap 的主要优点是可以消除其他 js 库(如 jquery 和 popper)的依赖关系,还可以为 bootstrap 编写组件。

【讨论】:

找不到模块:错误:无法解析“/home/www/angular/ngdemo/src/app”中的“@ng-bootstrap/ng-bootstrap” @Jay Momaya 你是先安装 ng-bootstrap 的吗? npm install --save @ng-bootstrap/ng-bootstrap 看这里link 为我工作。谢谢 为什么我们需要解决这个问题?为什么引导默认折叠功能不起作用? @HimalayaGarg 可能是因为 ng-bootstrap 不需要 jquery,所以这个功能不能正常工作【参考方案2】:

使用 ng-bootstrap(或者在我的例子中是 ngx-boostrap)绝对简化了事情,因为我不必担心 jQuery 和 popper。正如当前接受的答案所述。

但这并没有彻底解决我的问题,因为我错过了重要的细节。启动并运行 ngx-bootstrap 后,您可以首先将 navbar-collapse div 的 collapse 属性绑定到组件文件中的变量:

<div [collapse]="isCollapsed" class="navbar-collapse collapse" id="navbar-main">
  ...
</div>

仅此还不够,您实际上需要自己修改此变量(这是我错过的部分),方法是绑定到切换按钮的单击事件:

<button (click)="isCollapsed = !isCollapsed" class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-main" aria-controls="navbar-main" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
</button>

(click)="isCollapsed = !isCollapsed" 对我来说是最基本的缺失部分。这会将按钮的 onClick 事件绑定到您的 isCollapsed 变量,在单击时切换它,从而适当地设置导航栏的 collapse 属性。

这是我发现的 jsfiddle 最终帮助我找出了我的错误: jsFiddle external link

【讨论】:

为我工作,谢谢。但是,我必须为 Angular 9 执行 [class.collapse]="isCollapsed" 才不会引发错误【参考方案3】:

工作导航栏

ng-bootstrap

入门 成分 零件

 <span class="github-buttons d-none d-lg-inline"> 
   <a class="github-button" 
      href="https://github.com/ng-bootstrap/ng-bootstrap" 
      target="_blank" 
      data-style="mega" 
      data-count-href="/ng-bootstrap/ng-bootstrap/stargazers" 
      data-count-api="/repos/ng-bootstrap/ng-bootstrap#stargazers_count" 
      data-count-aria-label="# stargazers on GitHub" 
      aria-label="Star ng-bootstrap/ng-bootstrap on GitHub">Star</a> 
   <a href="https://twitter.com/intent/tweet?button_hashtag=ngbootstrap" 
      class="twitter-hashtag-button" 
      data-size="large" 
      data-text="I&#39;m checking out ng-bootstrap, THE Angular UI framework for Bootstrap CSS" 
      data-url="https://ng-bootstrap.github.io" 
      data-show-count="true">Tweet #ngbootstrap</a> 
 </span> 

【讨论】:

【参考方案4】:

我已使用以下解决方案修复

component.html

<nav class="navbar navbar-expand-lg navbar-light bg-light shadow bg-body rounded">
<div class="container-fluid">
    <a class="navbar-brand" href="/"> applicationName </a>
    <button #collapseButton class="navbar-toggler" type="button" data-bs-toggle="collapse"
        data-bs-target="#navbarTogglerDemo02" aria-controls="navbarTogglerDemo02" aria-expanded="false"
        aria-label="Toggle navigation" (click)="togglePanel(collapseButton,collapsePanel)">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div #collapsePanel class="collapse navbar-collapse" id="navbarTogglerDemo02">
        <div class="navbar-nav me-auto mb-2 mb-lg-0"></div>
        <ul class="navbar-nav me-2">

            <li class="nav-item" *ngFor="let navItem of navMenuList">
                <a class="nav-link" [routerLink]="navItem.path">
                    <mat-icon>navItem.icon</mat-icon> navItem.name
                </a>
            </li>

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

组件.ts

togglePanel(collapseButton: HTMLElement, collapsePanel: HTMLElement) 
if (this.isCollapsed) 
  collapseButton.classList.add('collapsed');
  collapsePanel.classList.remove('show');
 else 
  collapsePanel.classList.add('show');
  collapseButton.classList.remove('collapsed');

this.isCollapsed = !this.isCollapsed

【讨论】:

【参考方案5】:

javascript 文件未加载。在 HTML 代码中的某处添加以下内容(最好在标题中):

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

请参阅https://getbootstrap.com/docs/5.1/getting-started/introduction/#js 和https://getbootstrap.com/docs/5.1/getting-started/javascript/ 了解更多信息。

【讨论】:

以上是关于折叠在导航栏面包屑按钮的 ng-bootstrap 和 Angular 4 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

切换按钮在引导程序4中不起作用,而角度7应用程序在导航栏中不起作用

Bootstrap 3.0 导航栏中的多个折叠按钮

切换按钮折叠在 Bootstrap 导航栏中不起作用

Bootstrap 4导航栏右对齐在移动设备上不折叠的按钮

按下后退按钮时,自动折叠移动设备上的下拉导航栏菜单

单击时使导航栏折叠/关闭