基本的に、現時点では次の Angular モジュールがあります。
landing
admin
core
shared
私が望むのは、モジュールAuthenticationGuard
内で呼び出される新しいガードを登録し、shared
それをさまざまなモジュールに提供することです。
現時点では、(ブートストラップするものである)内にガードを登録した場合にのみ機能し、またはlanding-module
に登録した場合は機能しません。admin.module
shared.module
これを行うと、次のようなエラーが表示されます。
の登録は、対応するモジュールの配列をguard
介して行われます。providers
私の目標は、すべてのモジュールで使用できるようにすることです。
モジュールcore
内からサービスを注入しても問題はありませんでした。admin
guards
services
現在、関連するファイルの一部は次のようになっています (簡潔にするために短縮されています)。
着陸.モジュール.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HomeComponent } from './home/home.component';
import { LandingRoutingModule } from './landing.routing.module';
import { SharedModule } from '../shared/shared.module';
import { CoreModule } from '../core/core.module';
import { SecurityModule } from '../security/security.module';
import { AdminModule } from '../admin/admin.module';
@NgModule({
declarations: [
HomeComponent
],
imports: [
SharedModule.forRoot(),
CoreModule.forRoot(),
SecurityModule,
LandingRoutingModule
],
providers: [],
bootstrap: [HomeComponent]
})
export class AppModule { }
着陸.ルーティング.モジュール
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HttpClientModule } from '@angular/common/http';
import { HomeComponent } from './home/home.component'
import { NotFoundComponent } from './../shared/components/not-found/not-found.component';
const appRoutes: Routes = [
{
path : '',
redirectTo : '/login',
pathMatch: 'full'
},
{
path : 'admin',
loadChildren: 'app/modules/admin/admin.module#AdminModule'
},
{
path: '**',
component: NotFoundComponent
}
];
@NgModule({
declarations: [],
imports: [
HttpClientModule,
RouterModule.forRoot(
appRoutes,
{ enableTracing: true }
)
],
exports: [
RouterModule
],
})
export class LandingRoutingModule { }
admin.module
import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '../shared/shared.module';
import { AdminLandingComponent } from './admin-landing/admin-
landing.component'
import { AdminChildComponent } from './admin-child/admin-child.component'
import { AdminRoutingModule } from './admin.routing.module';
@NgModule({
declarations: [
AdminLandingComponent,
AdminChildComponent
],
imports: [
CommonModule,
AdminRoutingModule
],
})
export class AdminModule { }
admin.routing.module
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AdminLandingComponent } from './admin-landing/admin-
landing.component';
import { AdminChildComponent } from './admin-child/admin-child.component';
import { AuthenticationGuard } from '../shared/guards/auth-guard.service'
const adminRoutes: Routes = [
{
path: '',
component: AdminLandingComponent,
canActivate: [AuthenticationGuard],
children: [
{
path: '',
children: [
{ path: 'child', component: AdminChildComponent }
]
}
]
}
];
@NgModule({
declarations: [],
imports: [
RouterModule.forChild(adminRoutes)
],
exports: [
RouterModule
],
})
export class AdminRoutingModule { }
共有モジュール
import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import { NotFoundComponent } from './components/not-found/not-
found.component'
import { AuthenticationGuard } from './guards/auth-guard.service';
@NgModule({
declarations: [
NotFoundComponent,
],
imports: [
CommonModule
],
})
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [AuthenticationGuard]
};
}
}
auth-guard.service
import { Injectable } from '@angular/core';
import {
CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot,
CanActivateChild,
NavigationExtras,
CanLoad,
Route
} from '@angular/router';
import { AuthenticationService } from '../../core/services/authentication-service/authentication.service';
@Injectable()
export class AuthenticationGuard implements CanActivate, CanActivateChild, CanLoad {
constructor(private authService: AuthenticationService, private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return true;
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.canActivate(route, state);
}
canLoad(route: Route): boolean {
return true;
}
}