компонент рендеринга в mat-sidenav-content

Я создал угловой боковой навигатор материала с помощью следующего HTML-шаблона:

<mat-sidenav-container>
<mat-sidenav>
 <!--menu component added here-->
</mat-sidenav>

<mat-sidenav-content>
  <app-home></app-home>
  <router-outlet></router-outlet>
</mat-sidenav-content>
</mat-sidenav-container>

Когда шаблон загружается в первый раз, компонент app-home будет отрисован. Когда выбран пункт меню, соответствующий компонент будет отображен в mat-sidenav-component, но app-home все равно появится. Могу ли я скрыть это, когда выбран пункт меню?


person Elias    schedule 07.01.2019    source источник


Ответы (1)


Из-за того, что я неправильно понял вопрос, я сделал последнее изменение.

В качестве вводной информации: метод тот же, если вы используете Angualr или Angular Material.

РЕДАКТИРОВАТЬ: Здесь вы можете увидеть тот же метод, примененный к Angular Material: Stack Blitz пример

ОРИГИНАЛ: Да, ваш компонент меню должен отправлять boolean ввод в контейнер вашей страницы с помощью eventEmitter, поэтому, когда страница загружена, состояние ввода по умолчанию - true, а при щелчке по пункту меню состояние ввода изменится на false, а app-home будет скрыто.

Ваш контейнер страницы (или основной компонент боковой навигации) будет таким

// Imports omitted
@Component({
  selector: 'page-container',
  template: `
  <mat-sidenav-container>
    <mat-sidenav opened mode="side">Lorem ipsum</mat-sidenav>
      <mat-sidenav-content>
         <menu-component (show)="show($event)" (hide)="hide($event)"></menu-component>
      </mat-sidenav-content>
      <mat-sidenav-content>
         <app-home [toggle]="visible"></app-home>
      </mat-sidenav-content>
  </mat-sidenav-container>`
  })

export class PageContainerPage {

    visible: boolean;

    show(event: boolean) {
      this.visible = event;
    }

    hide(event: boolean) {
      this.visible = event;
    }

}

Ваш компонент меню будет таким - здесь используется эмиттер событий и вывод

// Imports omitted
@Component({
  selector: 'menu',
  template: `
      <ul>
        <li (click)="showElement()">menu item 1</li>
        <li (click)="hideElement()">menu item 2</li>
      </ul>`
})

export class MenuComponent {
    showHideBoolean: boolean; // Just delete default value

    // Output to send
    @Output() show: EventEmitter<Boolean> = new EventEmitter<Boolean>();
    @Output() hide: EventEmitter<Boolean> = new EventEmitter<Boolean>();

    showHideElement(){
      console.log('you have click on a menu item')
      this.showHideBoolean = !this.showHideBoolean;

      if (this.showHideBoolean) {
         this.show.emit(true);
         console.log('value to send: ', this.showHideBoolean) 
      } else {
         this.hide.emit(false);
         console.log('value to send: ', this.showHideBoolean) 
      }
    }
}

Ваш компонент app-home будет таким - здесь используется input

@Component({
  selector: 'app-home',
  template: `
    <div [hidden]="toggle">I'm the first element</div>
    <div [ngClass]="{'color-red' : toggle}">I'm the second element!</div>
    <div *ngIf="toggle">I'm an element too!</div>`
})

export class AppHomeComponent {

    // Use @Import here
    @Input() toggle: Boolean; // Just remove the default value

}    
person Emanuele    schedule 08.01.2019
comment
Привет, Эмануэль, спасибо за ответ. Компонент боковой навигации, который я использую, представляет собой один базовый компонент боковой навигации из материала angular (см. material.angular. io / components / sidenav / overview). Я хочу только показать и скрыть компонент app-home. Я думал, что это можно сделать, как вы предлагаете, но не могу понять, где разместить эмиттер событий. - person Elias; 08.01.2019
comment
Привет, @Elias, может, я неправильно понял твой вопрос. Какой компонент вы хотите скрыть, когда щелкаете элемент внутри menu-component? Я изменил ответ, чтобы скрыть app-home компонент - person Emanuele; 08.01.2019
comment
Привет, Эмануэль, может быть, мой вопрос был непонятен, и я немного перефразировал его :) Компонент, который я хочу скрыть, - это компонент app-home. На основе вашего ответа я генерирую событие в navbar.component.ts, когда опция меню нажал, но я не могу прочитать значение в родительском компоненте - person Elias; 08.01.2019
comment
Очевидно, вы можете использовать другие методы из RxJS, такие как BehaviorSubject или Observables, но @Output и EventEmitter являются уникальными, которые не включают использование внешних библиотек. - person Emanuele; 08.01.2019
comment
он не работает на 100%. я как-то запутался. Что-то не подходит. При нажатии той же кнопки изменяется переменная showHideBoolean. - person Elias; 09.01.2019
comment
Решено по предложению Эмануэля с небольшими изменениями. Я использовал две разные функции для каждого испущенного вместо одной, потому что при повторном щелчке по той же опции меню результат был изменен (showHideBoolean имел новое значение, которое привело к испусканию отжима) и оставил app-home без изменений. Я также соответствующим образом изменил ответ - person Elias; 09.01.2019
comment
@Elias, я просмотрел ваше изменение. Чтобы избежать неизменного эффекта, просто удалите форму значения по умолчанию showHideBoolean: boolean; и форму @Input() toggle: Boolean. Я также обновил ссылку на пример stackblitz! Теперь вы можете открыть его в редакторе! Извините за беспокойство! - person Emanuele; 09.01.2019