2016-05-09 4 views
10

używam Angular 2 Material sidenav w moim projekcie w ten sposób:kątowy Materiał 2: sidenav przełączać się z innym składnikiem

app.component.ts (Główny) html widok:

<md-sidenav-layout> 
    <md-sidenav #start mode="side" [opened]="true"> 
     This is the main sidenav 
     <sidebar></sidebar> 
    </md-sidenav> 

    <md-sidenav #end align="end"> 
    This sidenav suppose to open from different components across my application to show extra information/data when user clicks an image for example. 
    <br> 
    <button md-button (click)="end.close()">Close</button> 
    </md-sidenav> 

<router-outlet></router-outlet> 

</md-sidenav-layout> 

teraz .. w celu otwarcia #end sidenav używam poniższy przycisk w tym samym składniku:

<button md-button (click)="end.open()">Open End Side</button>

Ale co jeśli chcesz użyć end.open() z innego komponentu do przełączania sidenav? Jak mam zrobić sidenav "gloal", aby móc otworzyć go na dowolnym komponencie w mojej aplikacji?

+0

ta powinna być za pomocą znacznika skośne Materiał2 i znacznik nie skośne materiału. – Splaktar

Odpowiedz

10

Zazwyczaj używana jest do tego usługa współdzielona.

Świadczenie usługi u wspólnego przodka. Komponent, który steruje stanem otwartym, wstrzykuje usługę, a komponenty, które chcą zażądać elementu sterującego, aby zmienić status, również wstrzykują usługę.

Kiedy jakiś komponent chce, aby sidenav przełączał się, wysyła zdarzenie, korzystając z usługi udostępnionej. Komponent sterujący przełącznikiem nasłuchuje zdarzeń i przełącza na żądanie.

Aby uzyskać więcej informacji zobacz https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service

+0

Czy usługa powinna być tutaj użyta, czy @ViewChild, tak jak druga odpowiedź? – TheUnreal

+1

'@ ViewChild' wymaga, aby cel był potomkiem bieżącego komponentu. Usługa działa w całej aplikacji. –