Как правильно спроектировать структуру компонентов Angular?

Я установил Angular с помощью CLI со стандартной структурой. По умолчанию точка входа в приложение - app.module.

app.module -> app.component

В шаблоне app.component.html:

<router-outlet>
</ router-outlet>

Этот шаблон должен быть виден только после авторизации.

Проблема в том, что когда я запрашиваю страницу авторизации (страницу входа), она вставляется в этот частный шаблон. Что случилось? Страница входа должна работать как отдельная страница.

Как это организовать?

Проблема описана на рис:

Как правильно спроектировать структуру компонентов Angular?

Почему шаблон вашего корневого компонента, не содержащий ничего конфиденциального, должен быть виден только после авторизации? Где бы что-нибудь отображалось, если нельзя отобразить шаблон корневого компонента?

JB Nizet 26.10.2018 01:06

У меня частный SPA, первая страница всегда страница входа. Это отдельная страница. Остальное - административная часть

OPV 26.10.2018 01:08

Это довольно непонятно и не отвечает на мои вопросы. Чего вы пытаетесь достичь и почему нельзя скрыть шаблон компонента приложения, который не содержит ничего, кроме выхода маршрутизатора?

JB Nizet 26.10.2018 01:09

У меня есть общедоступная страница входа. Остальные являются частными и доступны после входа в систему. Я не получил твоего ответа

OPV 26.10.2018 01:11

То, что вы хотите сохранить приватным и недоступным до входа в систему, не является вашим корневым компонентом. Это все компоненты страницы, кроме компонента страницы входа.

JB Nizet 26.10.2018 01:12

Думаю должно быть две разные страницы с двумя маршрутами-выходами

OPV 26.10.2018 01:12

Да, по умолчанию главная страница - это страница входа.

OPV 26.10.2018 01:13

Если вы можете предоставить, пожалуйста, структуру

OPV 26.10.2018 01:17
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
8
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы хотите сохранить приватным до входа в систему, не является вашим корневым компонентом. Что вы хотите сохранить конфиденциальным, так это все компоненты страницы, кроме компонента входа в систему.

Таким образом, вам просто нужна конфигурация маршрута, подобная следующей:

[
  { 
    path: 'login', 
    component: LoginComponent 
  },
  { 
    path: '', 
    canActivate: [AuthenticatedGuard], 
    children: [
        all your other pages here
    ]
  }  
]

И AuthenticatedGuard должен предотвратить активацию и перейти к маршруту входа в систему, если пользователь еще не прошел проверку подлинности.

По поводу второй части вашего вопроса. проблема в том, что ваш шаблон корневого компонента содержит гораздо больше, чем указано в первой части: он содержит левое меню в дополнение к выходу маршрутизатора. Удалите это из корневого компонента, поскольку вам не нужна эта боковая панель на всех страницах: на странице входа она не должна быть. Вместо этого поместите его в отдельный «подкорневой» компонент, который мы назовем основным компонентом. Этот компонент должен иметь в своем шаблоне левое меню и (второй) роутер-выход.

 [
  { 
    path: 'login', 
    component: LoginComponent 
  },
  { 
    path: '', 
    canActivate: [AuthenticatedGuard], 
    component: MainComponent,
    children: [
      // all your page components here
    ]
  }  
]

Альтернативой было бы оставить его, как в первой части ответа, и просто добавить *ngIf в левое меню, чтобы проверить, аутентифицирован ли пользователь или нет.

Да, но проблема в route-outlet. Я предоставлю интересующую вас картинку.

OPV 26.10.2018 01:19

Я добавил рис, проблема в том, что у меня есть шаблон HTML в app.component.html. Это частная часть. Когда я открываю страницу входа в систему, внутри приватной части отображается шаблон входа.

OPV 26.10.2018 01:26

Итак, вы рекомендуете переместить скелет шаблона в MainComponent.html? А в AppComponent.html оставить маршрут-выход в качестве основного?

OPV 26.10.2018 01:41

Не уверен, что вы имеете в виду, говоря «оставить маршрут-выход в AppComponent.html как основной». Компонент приложения, являющийся корневым компонентом, отображается независимо от маршрута. Таким образом, его шаблон должен содержать то, что является общим для страниц все, включая страницу входа. Поскольку меню не должно быть на странице входа, его не должно быть в шаблоне компонента приложения. Главный компонент - это родительский компонент для всех страниц, кроме страницы входа, поэтому там должно быть меню. И компонент приложения, и основной компонент должны иметь выход-маршрутизатор, поскольку у них обоих есть дочерние маршруты.

JB Nizet 26.10.2018 01:45

Я вас понял, я имел в виду, что app.component в моем случае должен содержать только маршрут-выход?

OPV 26.10.2018 01:50

Другие вопросы по теме