Угловая суб-навигация на основе маршрута - PullRequest
0 голосов
/ 09 мая 2018

Я создаю приложение Angular с двумя уровнями навигации в заголовке.

Навигация верхнего уровня видна на всех маршрутах в приложении, однако навигация второго уровня зависит от контекста и существует только на определенных маршрутах.

Например, при просмотре определенного курса в университетском веб-приложении навигация второго уровня может содержать ссылки на описание, предварительные условия, различные предметы и т. Д.

Одним из способов сделать это является создание компонента subnav, который имеет инструкцию switch и отображает правильный компонент subnav на основе маршрута:

<div [ngSwitch]="currentRoute">
  <course-sub-nav *ngSwitchCase="course"></course-sub-nav>
  <students-sub-nav *ngSwitchCase="students">...</students-sub-nav>
  <support-sub-nav *ngSwitchCase="support">...</support-sub-nave>
</div>

Мне не нравится это решение, потому что теперь компонент sub-nav знает слишком много обо всех различных контекстно-зависимых sub-navs.

Другой подход - использовать сервис для управления им. то есть иметь SubNavService.setNavigationLinks(links: NavLink[]), который принимает массив ссылок. Затем компонент sub-nav может прослушивать изменения SubNavService и динамически отображать список подссылок.

Это решение немного чище, однако оно означает, что мне нужно вызывать эту службу для любого компонента верхнего уровня, чтобы обеспечить обновление под-навигации. Мне также нужно очистить ссылки на страницах, не требующих навигации.

Третьим решением может быть что-то вроде:

<!-- In header.component.html -->
<div class="sub-nav">
  <ng-content="subnav"></ng-content>
</div>

<!-- IN course-page.component.html -->
<div>
  <subnav>
    <!-- my nav links -->
  </subnav>

  <div class="course-content">
    <router-outlet></router-outlet>
  </div>
</div>

Мне больше всего нравится этот подход, учитывая, что если существует субнав, субнав будет визуализироваться, а если нет, ничего не будет отображаться. Кроме того, соответствующий компонент имеет полный контроль над отображением ссылок в subnav. однако, учитывая, что course-page на самом деле не ребенок header, я не уверен, как я могу заставить его работать.

Мне было интересно, есть ли способ получить последний подход к работе. Если нет, будет ли второй подход наиболее прагматичным решением этой проблемы или существует более чистое решение?

1 Ответ

0 голосов
/ 09 мая 2018

Самым чистым решением будет второе упомянутое вами.

Наличие службы, которая будет обрабатывать меню - компонент меню будет подписываться и прослушивать изменения, в то время как другие компоненты будут обрабатывать, какие элементы им нужно иметь в меню.

...