Abhishek Chandran
Abhishek Chandran

Reputation: 1646

Angular4-Bootstrap4: Create subnav bar from navbar

I'm trying to implement two layers of navbar, and second one becomes visible with its respective options on clicking a link in first nav bar.

I tried to implement it with id and data-target as explained in its documentation, but plugin doesn't seem to work and ngx-bootstrap has not yet developed module for navbar.

HTML

<nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse">
  <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarLevelOne">
    <span class="navbar-toggler-icon"></span>
  </button>
  <a class="navbar-brand" href="#">BRAND</a>
  <div class="collapse navbar-collapse" id="navbarLevelOne">
    <ul class="navbar-nav">
      <li class="nav-item"><a class="nav-link" data-toggle="collapse" routerLinkActive="active"  data-target="#a">A</a></li>
      <li class="nav-item"><a class="nav-link" data-toggle="collapse" routerLinkActive="active"  data-target="#b">B</a></li>
      <li class="nav-item"><a class="nav-link" data-toggle="collapse" routerLinkActive="active"  data-target="#c">C</a></li>
    </ul>
  </div>
</nav>
<nav class="navbar navbar-toggleable-md navbar-light bg-faded">
  <div class="collapse navbar-collapse">
    <ul class="navbar-nav" id="a" >
      <li class="nav-item"><a class="nav-link" href="#">a</a></li>
      <li class="nav-item"><a class="nav-link" href="#">b</a></li>
      <li class="nav-item"><a class="nav-link" href="#">c</a></li>        
    </ul>
    <ul class="navbar-nav" id="b" >
      <li class="nav-item"><a class="nav-link" href="#">p</a></li>
      <li class="nav-item"><a class="nav-link" href="#">q</a></li>
      <li class="nav-item"><a class="nav-link" href="#">r</a></li>        
    </ul>
    <ul class="navbar-nav" id="c" >
      <li class="nav-item"><a class="nav-link" href="#">x</a></li>
      <li class="nav-item"><a class="nav-link" href="#">y</a></li>
      <li class="nav-item"><a class="nav-link" href="#">z</a></li>        
    </ul>
  </div>
</nav>

Upvotes: 1

Views: 352

Answers (1)

redbrocket
redbrocket

Reputation: 26

In your section where you have your subnav. Try to move the three nav lists into their own "collapse div". Like so:

    <nav class="navbar navbar-toggleable-md navbar-light bg-faded">
      <div class="collapse" id="a" *ngIf="a">
        <ul class="navbar-nav">
          <li class="nav-item"><a class="nav-link" href="#">a</a></li>
          <li class="nav-item"><a class="nav-link" href="#">b</a></li>
          <li class="nav-item"><a class="nav-link" href="#">c</a></li>
        </ul>
      </div>
      <div class="collapse" id="b" *ngIf="b">
        <ul class="navbar-nav">
          <li class="nav-item"><a class="nav-link" href="#">p</a></li>
          <li class="nav-item"><a class="nav-link" href="#">q</a></li>
          <li class="nav-item"><a class="nav-link" href="#">r</a></li>
        </ul>
      </div>
      <div class="collapse" id="c" *ngIf="c">
        <ul class="navbar-nav">
          <li class="nav-item"><a class="nav-link" href="#">x</a></li>
          <li class="nav-item"><a class="nav-link" href="#">y</a></li>
          <li class="nav-item"><a class="nav-link" href="#">z</a></li>
        </ul>
      </div>
    </nav>

When you click on a button that triggers the collapse function it only triggers the specified section. Therefore, if you show section A, and then click to show section B, A will still be there. To solve this, put in "*ngIf" on each section (like I've done above), the section A will then only be visible if a is set and same for C and B.

To make this work, make a simple function in your app.component.ts class:

setNav(s: string) {
    this.a = false;
    this.b = false;
    this.c = false;

    switch (s) {
      case 'a':
        this.a = true;
        break;
      case 'b':
        this.b = true;
        break;
      case 'c':
        this.c = true;
        break;
    }
  }

and then have click events on each of the buttons on the main nav:

<li class="nav-item"><a class="nav-link" data-toggle="collapse" routerLinkActive="active"  data-target="#a" (click)="setNav('a')">A</a></li>

The full HTML is then:

<nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse">
  <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarLevelOne">
    <span class="navbar-toggler-icon"></span>
  </button>
  <a class="navbar-brand" href="#">BRAND</a>
  <div class="collapse navbar-collapse" id="navbarLevelOne">
    <ul class="navbar-nav">
      <li class="nav-item"><a class="nav-link" data-toggle="collapse" routerLinkActive="active"  data-target="#a" (click)="setNav('a')">A</a></li>
      <li class="nav-item"><a class="nav-link" data-toggle="collapse" routerLinkActive="active"  data-target="#b" (click)="setNav('b')">B</a></li>
      <li class="nav-item"><a class="nav-link" data-toggle="collapse" routerLinkActive="active"  data-target="#c" (click)="setNav('c')">C</a></li>
    </ul>
  </div>
</nav>
<nav class="navbar navbar-toggleable-md navbar-light bg-faded">
  <div class="collapse" id="a" *ngIf="a">
    <ul class="navbar-nav">
      <li class="nav-item"><a class="nav-link" href="#">a</a></li>
      <li class="nav-item"><a class="nav-link" href="#">b</a></li>
      <li class="nav-item"><a class="nav-link" href="#">c</a></li>
    </ul>
  </div>
  <div class="collapse" id="b" *ngIf="b">
    <ul class="navbar-nav">
      <li class="nav-item"><a class="nav-link" href="#">p</a></li>
      <li class="nav-item"><a class="nav-link" href="#">q</a></li>
      <li class="nav-item"><a class="nav-link" href="#">r</a></li>
    </ul>
  </div>
  <div class="collapse" id="c" *ngIf="c">
    <ul class="navbar-nav">
      <li class="nav-item"><a class="nav-link" href="#">x</a></li>
      <li class="nav-item"><a class="nav-link" href="#">y</a></li>
      <li class="nav-item"><a class="nav-link" href="#">z</a></li>
    </ul>
  </div>
</nav>

Hope it solved the problem.

Upvotes: 1

Related Questions