Как создать / использовать компонент входа в систему с отложенной загрузкой в Angular 9?
У меня есть компонент входа в мой проект Angular, и он отлично работает. Но теперь я изменил структуру своего программного обеспечения с одного модуля на модули с отложенной загрузкой.
Я создал PublicModule
с LoginComponent
, ForgotPasswordComponent
а также RegistrationComponent
.
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, Injector, LOCALE_ID, NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { AuthService } from './services/auth/auth.service';
import { AuthInterceptorService } from './services/auth/auth-interceptor.service';
export let InjectorInstance: Injector;
@NgModule({
declarations: [
AppComponent,
],
entryComponents: [],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
],
providers: [
{ provide: LOCALE_ID, useValue: 'hu-HU' },
{ provide: ErrorHandler, useClass: AppErrorHandler },
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptorService,
multi: true
},
AuthService,
],
bootstrap: [AppComponent]
})
export class AppModule {
constructor(private injector: Injector) {
InjectorInstance = this.injector;
}
}
app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AuthGuard } from './services/auth/auth.guard';
import { DashboardComponent } from './components/dashboard/dashboard.component';
const routes: Routes = [
{ path: 'public', loadChildren: () => import('./modules/public/public.module').then(m => m.PublicModule) },
{ canActivate: [AuthGuard], path: '', component: DashboardComponent },
{ canActivate: [AuthGuard], path: '**', component: DashboardComponent },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
app.component.html
<div *ngIf="authService.user.value">
<!-- Logged in -->
<router-outlet></router-outlet>
</div>
<div *ngIf="!authService.user.value">
<!-- Not logged in -->
<app-login></app-login>
</div>
app.component.ts
import { Component } from '@angular/core';
import { AuthService } from './services/auth/auth.service';
import { InjectorInstance } from './app.module';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'My Awesome Project';
authService: AuthService = InjectorInstance.get<AuthService>(AuthService);
constructor() {
this.authService.autoLogin();
}
}
Я не получаю никаких ошибок ни во время сборки, ни во время рендеринга. Все в порядке, ноLoginComponent
не шоу.
Если я зарегистрирую authService.user.value
это ноль, поэтому <app-login></app-login>
должно быть видно, но это не так.
Есть идеи, где мне искать причину "ошибки"?
2 ответа
Я не думаю, что проблема связана с самим кодом, а скорее с концепцией.
Вы правильно создали ленивый загружаемый модуль под public
путь, что означает, что когда вы идете /public
он загрузит фрагмент модуля (проверьте вкладку сети, чтобы подтвердить это). Этот модуль также должен иметь маршрутизацию, вот как я бы его настроил:
const routes: Routes = [
{ path: 'forgot-password', component: ForgotPasswordComponent },
{ path: 'register', component: RegistrationComponent },
{ path: '', component: LoginComponent },
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class PublicRoutingModule {}
Конечно, для работы этот модуль маршрутизации необходимо импортировать в ваш общедоступный модуль.
Я заметил, что у вас есть AuthGuard, который должен проверять, вошел ли пользователь в систему или нет. Если нет, должно вызвать перенаправление на/public
. Вы можете найти фрагмент AuthGuard, выполняющего перенаправление, здесь https://twitter.com/michelepatrassi/status/1177193819848216576/photo/1.
Итак, ваш шаблон становится довольно простым
<router-outlet></router-outlet>
Если пользователь вошел в систему, router-outlet
будет содержать приборную панель. Если нет, пользователь будет перенаправлен наpublic
и будет содержать компонент входа в систему (если вы последуете приведенному мной примеру маршрутизации).
Измените свой app.component.html на:-
<div *ngIf="authService?.user?.value">
<!-- Logged in -->
<router-outlet></router-outlet>
</div>
<div *ngIf="!authService?.user?.value">
<!-- Not logged in -->
<app-login></app-login>
</div>