在使用ng-bootstrap和Angular 4时,在浏览器中无法呈现导航栏的问题

6

我正在构建我的第一个Angular 4应用程序,使用ng-bootstrap(Bootstrap 4 for Angular),而不是使用常规Boostrap。

ng-bootstrap网站(https://ng-bootstrap.github.io/#/components/accordion/api)没有列出导航栏组件(如Bootstrap 3或常规Bootstrap 4中所列出的)。这是否意味着我必须使用下拉菜单/按钮来构建菜单?或者我必须混合使用常规Bootstrap 4和ng-bootstrap?

我尝试在HTML中创建此菜单,但它无法在浏览器中呈现(只有一个品牌“MyWebSiteName”和屏幕上的一个小灰色框,没有导航栏)。

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">MyWebSiteName</a>
    </div>
     <div class="collapse navbar-collapse" id="myNavbar">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Home</a></li>
        <li class="dropdown">
          <a class="dropdown-toggle" data-toggle="dropdown" href="#">Page 1 <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Page 1-1</a></li>
            <li><a href="#">Page 1-2</a></li>
            <li><a href="#">Page 1-3</a></li>
          </ul>
        </li>
        <li><a href="#">Page 2</a></li>
        <li><a href="#">Page 3</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#"><span class="glyphicon glyphicon-user"></span> Sign Up</a></li>
        <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
      </ul>
    </div>
  </div>
</nav>

我的HTML有问题吗?还是有人有一个使用ng-bootstrap可以正常工作的导航栏示例?


你是否将Bootstrap CSS添加到你的项目中了? - ConnorsFan
是的 - NgbCheckbox 渲染得很好,所以 ng-bootstrap 组件正在工作。只是上面的 NAV 没有。 - TSG
2个回答

11
由于没有导航组件,您需要使用折叠功能ng-bootstrap的ngbCollapse组件以及NgbDropdown组件的下拉功能的组合。 您需要将ngbCollapse的实例绑定到div.collapse.navbar-collapse和组件类上的布尔属性。 ng-bootstrap不需要data-*,因此您可以删除诸如data-toggle =“collapse”之类的属性。 通过像单击事件这样的方式来切换组件类上的属性的开/关状态,从而控制折叠菜单的打开/关闭状态。 在这个例子中,通过在button.navbag-toggler上执行一个组件方法toggleMenu()来切换,该方法仅通过运算符反转布尔属性isCollapsed的值。
对于菜单项下拉菜单,您需要使用NgbDropdown组件。 您需要将属性ngbDropdownngbDropdownToggle应用于容器元素和切换元素。
<div class="nav-item dropdown" ngbDropdown>
  <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" ngbDropdownToggle>
    Dropdown
  </a>
  <div class="dropdown-menu" 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>

在 Bootstrap 4 navbar 的样式方面,您需要使用以下类:

导航栏需要使用带有 .navbar-toggleable-* 的包装 .navbar 进行响应式折叠和颜色方案类。

此外,在 Bootstrap 4 中,像 button.navbar-toggle 这样的元素现在是 button.navbar-toggler,带有一个 "r"。您可以使用类 navbar-inversebg-inverse 来设置标准反向导航栏。

HTML:

<nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse">
  <button class="navbar-toggler navbar-toggler-right" type="button" aria-controls="appNavigation" [attr.aria-expanded]="!isCollapsed" aria-label="Toggle navigation" (click)="toggleMenu()">
    <span class="navbar-toggler-icon"></span>
  </button>
  <a class="navbar-brand" href="#">My App</a>
  <div class="collapse navbar-collapse" id="appNavigation" [ngbCollapse]="isCollapsed">
    <div class="navbar-nav mr-auto">
      <a class="nav-item nav-link" routerLink="" routerLinkActive="active">Home</a>
      <a class="nav-item nav-link" routerLink="/about" routerLinkActive="active">About</a>
      <div class="nav-item dropdown" ngbDropdown>
        <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" ngbDropdownToggle>
            Dropdown
        </a>
        <div class="dropdown-menu" 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>
    </div>
  </div>
</nav>

TS:

export class NavigationComponent {
  isCollapsed = true;

  constructor() {}

  toggleMenu() {
    this.isCollapsed = !this.isCollapsed;
  }
}

这里有一个plunker演示功能和样式的实际效果。


谢谢!这很有帮助。但是我有一个问题,如何最好地为打开和关闭导航面板添加动画?就像在这个演示中一样(动画是由jQuery完成的):https://blackrockdigital.github.io/startbootstrap-logo-nav/ - Wolf359
@MehmetGunacti 目前 ng-bootstrap 中似乎没有提供折叠和类似组件的动画效果。您需要使用 Angular - Animations 等工具来实现折叠属性或 CSS3 过渡的动画效果。我建议避免尝试使用 jQuery。 - Alexander Staroselsky
index.html 中的 unpkg.com 是什么东西?config.js 中的内容又是从哪里来的?我有 Angular 5 的 ng-book,但好像里面没有这些内容... - Mike Glaz
@mikeglaz unpkg 是一个用于 npm 包的 CDN。在 plunker 示例中,unpkg 被特别用于快速获取必要的依赖项以进行公共示例/演示。如果您在 plunker 中使用内置模板创建一个空的 Angular 2+ 项目,它将自动生成带有 CDN 引用的 index.html。在实际的生产应用程序中,最好使用某种构建过程以最有效的方式打包所有依赖项。谢谢! - Alexander Staroselsky
谢谢。也许这只是我自己的问题,但要让您的HTML工作,我必须进行以下更改:1-<a class="navbar-brand" href="#">My App</a>链接应该在<button>之前而不是之后; 2-第一行“navbar-inverse bg-inverse”更改为“navbar-light bg-light”; 3-第一行“navbar-toggleable-md”更改为“navbar-expand-md”。 - Sergio Morstabilini
下拉菜单也需要更改:具有“dropdown-menu”类的div应该具有“ngbDropdownMenu”属性。 - Sergio Morstabilini

1

请尝试使用Angular而非ng-Bootstrap实现相同的功能。

以下是一个小例子:

模板

<nav class="navbar navbar-toggleable-md navbar-light bg-faded  navbar-fixed-top">
  <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarNavDropdown"
    aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation" (click)="isActive = !isActive"> // add this for the responsive button
    <span class="navbar-toggler-icon"></span>
  </button>
  <a routerLink="/home"><img src="angular.png" class = "myImage" alt="Image"/></a>
  <div class="collapse navbar-collapse" id="navbarNavDropdown" [ngClass]="{show : isActive}">
    <ul class="navbar-nav">
      <li class="nav-item dropdown" [routerLinkActive]="['active']" appDropdown> // add this directive for the dropdown
        <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Basic Concepts
        </a>
.....

Directive

 import {Directive, HostListener, HostBinding} from '@angular/core';

  @Directive({
    selector: '[appDropdown]'
  })
  export class DropdownDirective {

    private isOpen:boolean = false;

    @HostBinding('class.open') get opened(){
      return this.isOpen;
    }
    constructor() { }

    @HostListener('click')open(){
      this.isOpen = true;
    }

    @HostListener('mouseleave')close(){
      this.isOpen = false;
    }

使用Bootstrap和Angular指令制作的顶部导航栏的同一示例 链接

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