角度2 - 如何隐藏某些组件中的导航栏

时间:2017-03-30 12:58:08

标签: html angular

我在nav.component.html中分别创建了导航栏,如何隐藏某些组件中的导航栏,例如login.component。

  

nav.component.html

<nav class="navbar navbar-default navbar-fixed-top navClass">
    <div class="container-fluid">
        <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed"
                        (click)="toggleState()">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>

        </div>
         <div class="collapse navbar-collapse"
              [ngClass]="{ 'in': isIn }">
          enter code here   <ul class="nav navbar-nav">
               <li class="active"><a href="#">Home</a></li>
               <li><a href="#">about</a></li>

            </ul>

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

9 个答案:

答案 0 :(得分:46)

整个应用程序通常都需要Navbar控件和格式,因此NavbarService非常有用。注入您需要的组件。

navbar.service.ts:

import { Injectable } from '@angular/core';

@Injectable()
export class NavbarService {
  visible: boolean;

  constructor() { this.visible = false; }

  hide() { this.visible = false; }

  show() { this.visible = true; }

  toggle() { this.visible = !this.visible; }

  doSomethingElseUseful() { }

  ...
}

navbar.component.ts:

import { Component } from '@angular/core';
import { NavbarService } from './navbar.service';

@Component({
  moduleId: module.id,
  selector: 'sd-navbar',
  templateUrl: 'navbar.component.html'
})

export class NavbarComponent {

  constructor( public nav: NavbarService ) {}
}

navbar.component.html:

<nav *ngIf="nav.visible">
 ...
</nav>

example.component.ts:

import { Component, OnInit } from '@angular/core';
import { NavbarService } from './navbar.service';

@Component({
})
export class ExampleComponent implements OnInit {

  constructor( public nav: NavbarService ) {}
}
ngOnInit() {
  this.nav.show();
  this.nav.doSomethingElseUseful();
}

答案 1 :(得分:5)

添加到Dan的答案。

完整答案所需的一个细节。这是从app.module.ts

注册import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { HttpModule } from '@angular/http'; import { SharedModule } from './shared/shared.module'; import { AppComponent } from './app.component'; import { NavbarModule } from './navbar/navbar.module'; import { NavbarService } from './navbar/navbar.service'; import { AppRoutingModule, routedComponents } from './routing.module'; @NgModule({ imports: [ BrowserModule, FormsModule, HttpModule, NavbarModule, SharedModule, AppRoutingModule ], declarations: [ routedComponents, ], providers: [ // Here we register the NavbarService NavbarService ], bootstrap: [AppComponent] }) export class AppModule { } 作为整个应用程序的提供者
DATE

答案 2 :(得分:2)

在模板中添加* ngIf ='!showNav'

<nav class="navbar navbar-default navbar-fixed-top navClass" *ngIf='!showNav' >

在LoginComponent

showNav = true;

这将显示所有页面的导航其余部分,如果您想隐藏在任何页面中,只需将showNav = true;放入该组件中。

工作原理:

首先它将检查showNav变量,但它不可用,因此对于我们要显示菜单的其他页面,它将返回false,因此需要将该变量声明为任何其他页面。

在登录页面中,我们将值设置为true,因此它会将其设为false并隐藏导航。

答案 3 :(得分:2)

我喜欢丹上面的answer。但是,它确实会创建一些更新控制台错误,我不希望它在生产应用程序中。我建议改为使用这种方法:answer

使用canDeactivate完成实现可能也会有所帮助。在我隐藏导航栏的地方,例如在登录时,我添加了导航'canDeactive'服务:

{ path: 'login', component: LoginComponent, canDeactivate: [NavigateAwayFromLoginDeactivatorService]  },

停用服务如下所示:

import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { LoginComponent } from "app/user/login/login.component";
import { NavbarTopService } from "app/navbar-top/navbar-top.service";

@Injectable()
export class NavigateAwayFromLoginDeactivatorService implements CanDeactivate<LoginComponent> {

  constructor(public nav: NavbarTopService) {  }

  canDeactivate(target: LoginComponent) {
    this.nav.show();
    return true;
  }
}

这样,我只能在登录时隐藏,不需要在每个其他组件上调用show()

答案 4 :(得分:1)

为了使其工作,还要在导入NavbarService的任何地方添加“提供者”

navbar.component.ts以及example.component.ts

@Component({
  moduleId: module.id,
  selector: 'sd-navbar',
  templateUrl: 'navbar.component.html',
  providers: [NavbarService ]
})

答案 5 :(得分:0)

您可以在导航所在的组件上使用ngIF指令

   <nav *ngIf="this.currentRoute!=='login'" navigation>
   </nav>

获得当前路线后:

  this.router.events.subscribe(event => {
  if (event.constructor.name === "NavigationEnd") {
    this.name = (<any>event).url.split("/").slice(-1)[0];
    this.isLogin = this.currentRoute === 'login';
  }
})

答案 6 :(得分:0)

通过将数据对象添加到route.module中的路由,我无需使用导航/工具栏服务就能解决此问题。我在Todd Motto's example of adding dynamic titles to a page上进行了扩展,并向路径中的数据对象添加了toolbar: false/true。然后,我在我的toolbar.component中订阅了路由器事件。使用Todd的事件侦听器功能,我读取了路径对象,并使用布尔值将工具栏设置为可见或不可见。

不需要服务,可以在pagerefresh上使用。

路由模块

...
const routes: Routes = [
{ path: 'welcome', component: WelcomeComponent, data: { title: 'welcome', toolbar: false} }, ...];

toolbar.component

constructor(private router: Router, private activatedRoute: ActivatedRoute, public incallSvc: IncallService) {
    this.visible = false; // set toolbar visible to false
  }

  ngOnInit() {
    this.router.events
      .pipe(
        filter(event => event instanceof NavigationEnd),
        map(() => this.activatedRoute),
        map(route => {
          while (route.firstChild) {
            route = route.firstChild;
          }
          return route;
        }),
      )
      .pipe(
        filter(route => route.outlet === 'primary'),
        mergeMap(route => route.data),
      )
      .subscribe(event => {
        this.viewedPage = event.title; // title of page
        this.showToolbar(event.toolbar); // show the toolbar?
      });
  }

  showToolbar(event) {
    if (event === false) {
      this.visible = false;
    } else if (event === true) {
      this.visible = true;
    } else {
      this.visible = this.visible;
    }
  }

toolbar.html

<mat-toolbar color="primary" *ngIf="visible">
  <mat-toolbar-row>
    <span>{{viewedPage | titlecase}}</span>
  </mat-toolbar-row>
</mat-toolbar>

答案 7 :(得分:0)

此问题的另一种解决方案,特别是如果您希望通过其他控件打开/关闭/切换/导航栏,请在服务中保存对导航栏的引用,如下所述:

https://stackoverflow.com/a/48076331/1013544

这对我来说很好,因为我有一个应用程序,其中侧面导航更像是根元素,而路由器组件是其内容,因此当打开侧面导航菜单时,它们将在后台被禁用。

答案 8 :(得分:0)

如果您要隐藏mat-sidenav元素,JaganY的linked answer above是最好的答案。您永远都不会有需要更改检测的简单代码。这是其他类型元素的示例:

app.componenent.html

    <nav #rNav>
      <app-rightnav></app-rightnav>
    </nav>

app.componenent.ts

  @ViewChild('rNav') rNav!: ElementRef;

  constructor(public nav: NavbarService) { }

  ngAfterViewInit(): void {
    this.nav.setRight(this.rNav);
  }

navbar.service.ts

import { Injectable, ElementRef } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class NavbarService {

  private right!: ElementRef;
  private visible!: boolean;

  hideR() { 
    this.visible = false;
    this.right.nativeElement.style.display = 'none';
  }

  showR() { 
    this.visible = true; 
    this.right.nativeElement.style.display = 'block';
  }

  toggleR() { this.visible ? this.hideR() : this.showR(); }

  setRight(e: ElementRef) {
    this.right = e;
  }
}

child-components.html

constructor() {
  this.nav.hideR(); // or this.nav.showR();
}