2017-05-31 1 views
1

J'ai commencé à apprendre la conception d'Angular2 et de matériel. Je veux créer une application qui a les composants ci-dessous. Voir ci-dessous image pour référenceSidenav réutilisable dans la conception matérielle d'Angular2

  1. Bouton de menu Hamburger. En tapant dessus, vous découvrirez le panneau latéral
  2. Panneau latéral. Il aura plusieurs autres options. Ce menu est commun à tous les écrans d'applications

enter image description here

J'ai créé 3 composants visibles dans l'image. droit menu component.html se présente comme ci-dessous

<md-sidenav #sidenav mode="side" class="app-sidenav"> 
    <ul> 
    <li>Menu Item</li> 
    <li>Menu Item</li> 
    <li>Menu Item</li> 
    <li>Menu Item</li> 
    <li>Menu Item</li> 
    <li>Menu Item</li> 
    </ul> 
</md-sidenav> 

Je veux savoir comment puis-je révélerai ce menu appuyant sur le bouton, que ce soit à partir de l'écran d'accueil ou l'écran à propos

L'exemple le docs montrent la mise en œuvre dans une seule page, mais pas en tant que composant de menu réutilisable

Edit 1: Je ne voudrais pas placer le bouton sur la page racine que certains écrans tels que connexion, l'enregistrement etc. seront pas avoir le menu. Mais si les placer sur la page racine est une meilleure approche et le bouton peut être montré/caché, je vais l'ajouter ensuite.

Édition 2: J'ai essayé d'utiliser l'exemple dans les docs Angular sans changer de ligne de code.

<md-sidenav-container class="example-container"> 
    <md-sidenav #sidenav class="example-sidenav"> 
    Jolly good! 
    </md-sidenav> 

    <div class="example-sidenav-content"> 
    <button md-button (click)="sidenav.open()"> 
     Open sidenav 
    </button> 
    </div> 

</md-sidenav-container> 

Lorsque je clique sur le bouton "sidenav ouvert", il donne l'erreur ci-dessous dans la console

EXCEPTION: Error in ./HomeComponent class HomeComponent - inline template:34:4 caused by: self._el_42.open is not a function 

Edit 3: Voici les versions des modules

angular-cli: 1.0.0-beta.28.3 
node: 6.9.5 
os: darwin x64 
@angular/animations: 4.1.3 
@angular/common: 2.4.10 
@angular/compiler: 2.4.10 
@angular/core: 2.4.10 
@angular/forms: 2.4.10 
@angular/http: 2.4.10 
@angular/material: 2.0.0-beta.3 
@angular/platform-browser: 2.4.10 
@angular/platform-browser-dynamic: 2.4.10 
@angular/router: 3.4.10 
@angular/compiler-cli: 2.4.10 
+0

la solution évidente serait de mettre le bouton et la barre latérale sur la page racine et utilisez pour changer tout le reste – elasticrash

+0

@elasticrash: S'il vous plaît lire le modifier. En outre, pouvez-vous partager un code qui invoque/révèle le bon menu (sidenav) à partir de différentes pages – Sahil

+0

il existe d'autres façons plus complexes d'y parvenir, comme l'injection dynamique d'un composant dans une vue ... par un garde d'itinéraire par exemple. qui est assez similaire à cette approche https://stackoverflow.com/questions/41602522/dynamically-load-different-css-files-in-angular2-application-based-on-users-lan/44111038#44111038 – elasticrash

Répondre

0

Créez un service qui gère la connexion entre le sidenav et la barre d'outils.

sidenav.service.ts

@Injectable() 
export class SidenavService { 
    toggle = new EventEmitter(); 

    constructor() { 
    } 
} 

toolbar.component.ts

export class ToolbarComponent implements OnInit { 

    constructor(public sidenavService: SidenavService) { } 
} 

toolbar.component.html

<md-toolbar color="primary" fxLayout="row" color="none"> 
    <button ... (click)="sidenavService.toggle.emit()"> ... </button> 
</md-toolbar> 

sidenav.component.ts

@ViewChild('sidenav') sidenav: MdSidenav; 

constructor(private sidenavService: SidenavService) { 

    this.sidenavService.toggle 
     .asObservable() 
     .subscribe(
     () => this.sidenav.toggle() 
     ); 
} 

sidenav.component.html

<md-sidenav #sidenav>...</md-sidenav> 
+0

J'ai essayé le comme vous l'avez décrit. Cliquer sur le bouton donne l'erreur "sidenav.toggle n'est pas une fonction" dans sidenav.component.ts. console.log (sidenav) affiche "ElementRef {nativeElement: md-sidenav.app-sidenav}" – Sahil

+0

Je l'ai testé une fois de plus, mais pour moi cela fonctionne. Pouvez-vous m'en dire plus sur votre problème? Ou quelle version du matériel vous utilisez –

+0

J'ai ajouté les versions dans Editer 3 – Sahil