Angular 2 материал: sidenav переключается с другого компонента
Я использую Angular 2 Материал sidenav в моем проекте таким образом:
app.component.ts
(Основной) html view:
<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>
Теперь.., чтобы открыть sidenav #end
, я использую следующую кнопку в том же компоненте:
<button md-button (click)="end.open()">Open End Side</button>
Но что, если я хочу использовать end.open()
из другого компонента для переключения sidenav?
Как я должен сделать sidenav "gloal", чтобы я мог открыть его на любом компоненте в моем приложении?
Ответы
Ответ 1
Обычно для этого используется общая услуга.
Предоставить услугу у общего предка. Компонент, который контролирует открытый статус, вводит службу, а компоненты, которые хотят запросить управляющий компонент для изменения состояния, также вводят службу.
Когда какой-либо компонент хочет переключиться на sidenav, они отправляют событие с использованием общей службы. Компонент, управляющий переключателем, прослушивает события и переключается по запросу.
Подробнее см. https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service
Ответ 2
Используйте @ViewChild из вашего родительского компонента и передайте его компоненту, которому вы хотите получить доступ к методам sidenav (открыть, закрыть toggle).
ref: https://yakovfain.com/2016/04/19/angular-2-exposing-child-components-api/
export class ParentComponent {
@ViewChild('start') start:MdSidenav;
}