J'ai créé la barre de navigation séparément dans nav.component.html, comment masquer la barre de navigation dans certains composants tels que 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>
Le contrôle et le formatage de la barre de navigation sont souvent nécessaires dans une application. Un service Navbar est donc utile. Injectez dans les composants où vous avez besoin.
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();
}
Ajout à la réponse de Dan .
Un détail supplémentaire requis pour une réponse complète. Qui enregistre le NavbarService
en tant que fournisseur pour l’application entière à partir de 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 { }
J'aime cette réponse par Dan ci-dessus. Cependant, cela crée des erreurs de console de mise à jour, ce que je ne souhaite pas dans une application de production. Je suggérerais plutôt d'utiliser cette méthode: réponse .
Il peut également être utile d’utiliser un canDeactivate pour terminer la mise en œuvre. Là où je cachais la barre de navigation, comme lors de la connexion, j'ai ajouté un service de navigation 'canDeactive':
{ path: 'login', component: LoginComponent, canDeactivate: [NavigateAwayFromLoginDeactivatorService] },
Le service de désactivation ressemble à ceci:
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;
}
}
De cette façon, je ne peux me cacher que lors de la connexion et je n'ai pas besoin d'appeler show()
sur tous les autres composants.
J'ai pu résoudre ce problème sans utiliser un service de navigation/barre d'outils en ajoutant un objet de données à l'itinéraire dans route.module. J'ai développé exemple de Todd Motto pour l'ajout de titres dynamiques à une page et ajouté toolbar: false/true
à l'objet de données dans mon chemin. Je me suis ensuite abonné aux événements de routeur dans mon toolbar.component. À l'aide de la fonction d'écoute d'événement de Todd, j'ai lu l'objet Path et utilisé la valeur booléenne pour définir la barre d'outils visible ou non visible.
Aucun service nécessaire et fonctionne sur pagerefresh.
...
const routes: Routes = [
{ path: 'welcome', component: WelcomeComponent, data: { title: 'welcome', toolbar: false} }, ...];
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;
}
}
<mat-toolbar color="primary" *ngIf="visible">
<mat-toolbar-row>
<span>{{viewedPage | titlecase}}</span>
</mat-toolbar-row>
</mat-toolbar>
Ajouter * ngIf = '! ShowNav' dans le modèle
<nav class="navbar navbar-default navbar-fixed-top navClass" *ngIf='!showNav' >
Et dans LoginComponent
showNav = true;
Cela affichera le reste de la navigation de toutes les pages, si vous voulez vous cacher dans les pages, mettez simplement showNav = true;
dans cette composante.
Comment ça marche:
D'abord, il vérifiera la variable showNav
mais elle ne sera pas disponible. Par conséquent, elle retournera la valeur false pour les autres pages sur lesquelles nous voulons afficher le menu.
Dans la page de connexion, nous définissons la valeur sur true. Elle sera donc fausse et masquera la navigation.
Vous pouvez utiliser la directive ngIF sur les composants où se trouve nav
<nav *ngIf="this.currentRoute!=='login'" navigation>
</nav>
après avoir obtenu l'itinéraire actuel:
this.router.events.subscribe(event => {
if (event.constructor.name === "NavigationEnd") {
this.name = (<any>event).url.split("/").slice(-1)[0];
this.isLogin = this.currentRoute === 'login';
}
})
Pour que cela fonctionne, ajoutez également des "Fournisseurs" partout où vous importez le NavbarService.
navbar.component.ts et aussi example.component.ts
@Component({
moduleId: module.id,
selector: 'sd-navbar',
templateUrl: 'navbar.component.html',
providers: [NavbarService ]
})
Une autre solution à ce problème, en particulier si vous souhaitez ouvrir/fermer/basculer/la barre de navigation latérale à partir d'autres contrôles, consiste à conserver une référence à la barre de navigation latérale dans un service, comme indiqué ci-dessous:
https://stackoverflow.com/a/48076331/1013544
cela fonctionnait bien pour moi car j'avais une application où la navigation latérale ressemblait davantage à l'élément racine et les composants du routeur en contenaient le contenu, de sorte qu'ils seraient désactivés en arrière-plan lorsque le menu de navigation latérale est ouvert.