Угловые 5-ти кратные роутеры и подмодули
Изучив документацию и все остальные вопросы, я все еще не могу найти приемлемый вариант для моего проекта. Я ушел от названной опции router-outlets, потому что она делает URL не таким чистым. Похоже, что со многими ответами (и я использую термин слегка, так как большинство из них либо неполные, непроверенные, либо у людей все еще есть вопросы в комментариях), кажется, для более старых версий angular, что может быть, поэтому они не являются работая как решение для меня. Будем весьма благодарны за любые другие варианты, которые могут быть представлены!
Я пытаюсь использовать два отдельных выхода маршрутизатора - один для разграничения входа в систему и нет, а другой для некоторых динамически обновляемых компонентов после проверки пользователя. До того, как у меня было требование входа в систему, выход маршрутизатора находился внутри моего основного компонента рядом с другим компонентом, который имел ссылки на маршрутизатор. Прямо сейчас, с помощью функции входа в систему, лучшее, что я могу сделать, это сделать так, чтобы все компоненты проходили через первую розетку маршрутизатора - но это разрушает родственные компоненты, которые должны отображаться.
Мое приложение в настоящее время структурировано так:
app/
| app.module.ts
| app-routing.module.ts
| app.component.html
| components/
| | header-comp/
| | login-comp/
| | sub-module/
| | | detail-comp/
| | | list-comp/
| | | new-comp/
| | | main-comp/
| | sub.module.ts
| | sub-routing.module.ts
App.module.ts:
import {...} from ...;
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
LoginComponent
],
imports: [
AppRoutingModule,
BrowserModule,
SubModule,
SubRoutingModule,
CommonModule,
FormsModule,
HttpClientModule,
...
],
providers: [...],
bootstrap: [AppComponent]
})
export class AppModule { }
Приложение-routing.module:
import {...} from ...;
import { RouterModule, Routes } from '@angular/router';
import { ModuleWithProviders } from '@angular/core';
const appRoutes: Routes = [
{ path: 'login', pathMatch: 'full', component: LoginComponent },
{ path: '', pathMatch: 'full', loadChildren: 'app/components/sub-module/sub.module#SubModule' },
{ path: '**', redirectTo: '' }
];
export const AppRoutingModule: ModuleWithProviders = RouterModule.forRoot(appRoutes);
app.component.html - это должно переключаться между страницей входа или '', которая затем загрузит субмодуль и отобразит main.component.html:
<div class="container-fluid">
<app-header></app-header>
<router-outlet></router-outlet>
</div>
sub.module.ts:
import {...} from ...;
@NgModule({
declarations: [
MainComponent,
DetailComponent,
ListComponent,
NewComponent,
],
imports: [
SubRoutingModule,
...
],
bootstrap: [MainComponent]
})
export class SubModule { }
Модуль sub-routing.module:
import {...} from ...;
import { RouterModule, Routes } from '@angular/router';
import { ModuleWithProviders } from '@angular/core';
const subRoutes: Routes = [
{ path: '', pathMatch: 'full', children: [
{ path: '', pathMatch: 'full', component: MainComponent },
{ path: 'new', pathMatch: 'full', component: NewComponent },
{ path: 'items/:id', pathMatch: 'full', component: DetailComponent },
] }
];
export const SubRoutingModule: ModuleWithProviders = RouterModule.forRoot(subRoutes);
main.component.html - он всегда должен загружаться, если пользователь вошел в систему. Он отображает три других компонента (два из которых, новый и подробный компоненты, проходят через мой второй желаемый маршрутизатор) и передает информацию @Input. к компоненту списка:
<div>
<div class="col-2 list list-group">
<app-list [AllItems]="items" [routeId]="routeId"></app-list>
</div>
<div class="col-10 main">
<router-outlet></router-outlet>
</div>
</div>
В list.component.html есть ссылка на маршрутизатор для подробного компонента:
<ul>
<li *ngFor="let item of AllItems">
<a [routerLink]="['/items', item.id]">
<div>{{item.name}}</div>
</a>
</li>
</ul>
Я хотел бы иметь возможность использовать этот второй выход маршрутизатора в качестве основного выхода после входа в систему, потому что жесткое кодирование в компонентах app-new и app-detail вместо этого было бы очень громоздким и не использовало бы цель использования маршрутов и функций ввода. - динамическая полезность страницы будет потеряна. Мне действительно нужна только первая розетка, чтобы определить, вошел ли кто-то в систему или нет, кажется, что пустая розетка роутера, если я не могу ее выключить или как-то обойти.
Вторая пара глаз будет высоко ценится! (Я открыт для реструктуризации обратно в один файл маршрутизатора и без субмодуля, если кто-то думает, что это будет работать лучше.)
1 ответ
После прочтения вашего вопроса, я думаю, что структура одного маршрутизатора будет полностью соответствовать вашим потребностям.
Прежде чем вы захотите достичь чего-либо с помощью маршрутизаторов, тщательно подумайте, действительно ли это лучший вариант?
Я понимаю, что вы хотите выполнить следующие 2 требования:
- различать вошедших в систему и не
- динамически обновлять некоторые компоненты
Если это так, первое требование может быть достигнуто простым использованием 2 разных компонентов для входа / выхода из системы.
<app-component-when-login *ngIf="isLogin"></app-component-when-login>
<app-component-when-logout *ngIf="!isLogin"></app-component-when-logout>
Для второго требования, дочерние маршрутизаторы должны делать свое дело.
Я бы порекомендовал простой способ проверить, действительно ли вам нужны роутер-розетки для участия или нет. То есть, если эта функция должна отражать текущее состояние в URL, тогда да, вы можете использовать выходы маршрутизатора, в противном случае вам не нужно. Потому что это просто делает простые вещи более сложными.