2017-05-31 9 views
1

Ich habe begonnen, Angular2 und Material Design zu lernen. Ich möchte eine App erstellen, die die folgenden Komponenten enthält. Siehe Bild unten für ReferenzWiederverwendbare SideNav in Angular2 Material Design

  1. Hamburger-Menü-Taste. Durch Antippen wird das Seitenteil freigegeben.
  2. Seitenteil. Es wird mehrere andere Optionen haben. Dieses Menü ist in allen App-Bildschirmen

enter image description here

Ich habe erstellt 3 Komponenten wie im Bild sichtbar gemeinsam. rechten Menü-component.html sieht wie unten

<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> 

Ich möchte wissen, wie enthüllen ich dieses Menü auf die Schaltfläche auf die Erschließung, sei es auf dem Startbildschirm oder dem Bildschirm über

Das Beispiel in die docs zeigen die Implementierung auf einer einzigen Seite, aber nicht als wiederverwendbare Menükomponente

Edit 1: ich würde nicht wie Login, Registrierung wie die Taste auf der root-Seite als einige Bildschirme platzieren usw. wird nicht Habe die Speisekarte. Aber wenn sie auf der Root-Seite platziert werden, ist ein besserer Ansatz und die Schaltfläche kann angezeigt/versteckt werden, ich werde es dann hinzufügen.

Bearbeiten 2: Ich habe versucht, das Beispiel in der Angular Docs, ohne eine Zeile Code zu ändern.

<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> 

Als ich "open sidenav" klicken, gibt es die folgenden Fehler in der Konsole

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

bearbeiten 3: Im Folgenden sind die Versionen der Module

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

die offensichtliche Lösung wäre es, die Taste und Seitenleiste auf der Root-Seite zu setzen und verwenden alles andere – elasticrash

+0

@elasticrash ändern: Bitte lesen Sie die bearbeiten. Außerdem können Sie Code teilen, der das rechte Menü (sidenav) von verschiedenen Seiten aufruft – Sahil

+0

Es gibt andere, etwas kompliziertere Möglichkeiten, dies zu erreichen, wie das dynamische Einfügen einer Komponente in eine Ansicht ... zum Beispiel durch einen Routenwächter. Das ist ziemlich ähnlich zu diesem Ansatz https://StackOverflow.com/Questions/41602522/dynamically-Load-Different-Css-Files-In-angular2-Application-Based-on-users-lan/44111038#44111038 – elasticrash

Antwort

0

Erstellen Sie einen Dienst, der die Verbindung zwischen dem Sitenav und der Symbolleiste behandelt.

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

Ich habe versucht, die wie du es beschrieben hast. Ein Klick auf die Schaltfläche gibt den Fehler "sidenav.toggle ist keine Funktion" in sidenav.component.ts. console.log (sidenav) druckt "ElementRef {nativeElement: md-sidenav.app-sidenav}" – Sahil

+0

Ich habe es noch einmal getestet, aber für mich funktioniert es. Kannst du mir mehr über dein Problem erzählen? Oder welche Version von Material du verwendest –

+0

Ich habe die Versionen in Edit 3 hinzugefügt – Sahil