- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Angular 应用程序中,我想确定要为指定路径加载哪个模块。这与延迟加载无关。这是关于动态路由配置/确定。
我有一个有 3 种访问权限的应用程序。每个访问都在他自己的模块中。在应用程序加载时,我想确定要加载的模块。在根路由级别和子级别。
在我看来,Angular 在很多方面都非常灵活,但路由配置非常静态......
例子:
// routed module
const routes: Routes = [
{ path: '', loadChildren: () => getModuleType() }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
class ParentModule {}
// My problem is there, where can i put this function ???
getModuleType() {
// How can I have the dependecy injected ???
return someApiService.getProfile().map(profile => {
if (profile === 'A') {
return ProfileAModule;
}
if (profile === 'B') {
return ProfileBModule;
}
});
}
// some feature module
@NgModule({})
class ProfileAModule {}
@NgModule({})
class ProfileBModule {}
最佳答案
我会使用 protected 功能模块来实现这一点。
Feature X 文件夹和包含防护的 Core 文件夹的文件夹结构示例(如果需要,您可以拥有 N 个功能):
/core
/guard
/ feature-x.guard.ts
/feature-x
/feature-x.router.ts
/feature-x.module.ts
/feature-x.component.ts
/feature-x-home
/feature-x-home.module.ts
/feature-x-home.router.ts
/feature-x-home.component.ts
/feature-x-home.component.html
/feature-x-home.component.scss
/feature-x-route1
/feature-x-route1.module.ts
/feature-x-route1.router.ts
/feature-x-route1.component.ts
/feature-x-route1.component.html
/feature-x-route1.component.scss
feature-x.router.ts
会是这样的:
const featureXRoutes: Route[] = [
{
path: '',
component: RouteXFeatureComponent,
canActivate: [ FeatureXGuard ],
children: [
{ path: '', redirectTo: '/feature-x-home', pathMatch: 'full' },
{ path: 'feature-x-home', loadChildren: '@app/feature-x/feature-x-home/feature-x-home.module#FeatureXHomeModule' },
{ path: 'feature-x-route-1', loadChildren: '@app/feature-x/feature-x-route-1/feature-x-route-1.module#FeatureXRoute1Module' },
// ... etc
]
}
];
export const FeatureXRoutingModule: ModuleWithProviders = RouterModule.forChild(featureXRoutes);
feature-x-home.router.ts
:
const featureXHomeRoutes: Route[] = [{
path: '',
component: FeatureXHomeComponent
}];
export const featureXHomeRoutes: ModuleWithProviders = RouterModule.forChild(featureXHomeRoutes);
feature-x.module.ts
:
@NgModule({
imports: [
FeatureXRoutingModule
],
declarations: [
FeatureXComponent
]
})
export class FeatureXModule {}
feature-x.component.ts
:
@Component({
selector: 'app-feature-x',
template: '<router-outlet></router-outlet>',
styleUrls: [ './feature-x.component.scss' ]
})
export class FeatureXComponent {}
app.module.ts
:
@NgModule({
imports: [
CoreModule, // contains all guards declaration
Feature1Module, // feature-x with x = 1
Feature2Module,
Feature3Module,
//... etc
FeatureNModule,
AppRoutingModule
],
declarations: [
AppComponent
],
bootstrap: [ AppComponent ]
})
export class AppModule {}
providers
声明所有的守卫属性(property)。
app.router.ts
:
const appRoutes: Route[] = [
{ path: '', redirectTo: '/defaultRoute', pathMatch: 'full' },
{ path: '**', redirectTo: '/defaultRoute' }
];
export const AppRoutingModule: ModuleWithProviders = RouterModule.forRoot(appRoutes);
feature-x.module.ts
:
const FEATURE_X = 'YOUR_FEATURE_X';
@Injectable()
export class FeatureXGuard implements CanActivate {
constructor(
private profilService: ProfilService,
private router: Router
) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
const canGo = this.profileService.hasProfil(FEATURE_X);
if (!canGo) {
this._router.navigate([ this.profileService.getDefaultRouteFor(FEATURE_X) ]);
}
return canGo;
}
}
关于angular - 从服务动态确定 loadChildren 模块类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48768053/
我正在使用 Angular 2 的最终版本,并看到了 loadChildren 的一个很棒的延迟加载功能。 一个简单的例子 export const routes: Routes = [ { pa
我需要有条件地加载路由路径。我在下面尝试过。但它给出了这个错误。你能告诉我如何完成这种任务吗? [ng] ERROR in Cannot read property 'loadChildren' of
在 Angular 应用程序中,我想确定要为指定路径加载哪个模块。这与延迟加载无关。这是关于动态路由配置/确定。 我有一个有 3 种访问权限的应用程序。每个访问都在他自己的模块中。在应用程序加载时,我
Angular in the docs说如下: { path: 'admin', loadChildren: 'app/admin/admin.module#AdminModule', },
我创建了两个关于路由的 loadChildren 和 outlet 导航问题的插件。出于某种原因,在加载的子模块中有一个空的基本路径不适用于导出导航。 在this例如,按“联系人”链接失败。 app-
我想像这样进行 3 级路由:pages>firSTLevel>secondlevel>thirdlevel 但是 loadchildren 不加载 secondlevel.module 的路由。 ur
谁能告诉我component、loadChildren、redirectTo之间的区别? export const ROUTES: Routes = [{ path: '', redirectT
我想延迟加载我的模块,但同时使用 canActivate 保护它。我试过: { path: 'dashboard/vendor', canActivate: AuthGuard, loadChildr
这个问题在这里已经有了答案: How to manually lazy load a module? (2 个答案) 关闭 5 年前。 有没有一种方法可以直接从html中的标签延迟加载组件,比如 ?
我刚刚注意到 Angular 8(即将发布)已弃用“字符串类型路由器 loadChildren”。 ( ticket ) 我是否理解正确,他们指的是...... const routes = [
这个问题在这里已经有了答案: Angular 8 - Lazy loading modules : Error TS1323: Dynamic import is only supported whe
我有一个带有路由器 socket 的根应用程序组件,并且路由是从主模块路由加载的,该路由在其子路由中使用带有 loadchildren 的延迟加载。家庭组件中有一个路由器 socket ,家庭的所有子
在下面的代码中,除了第一个示例中我们需要将 productsModule 导入到文件中之外,这两种延迟加载路由的方式有什么区别? { path: 'products', loadchildren: (
有时我想将关系定义为延迟加载,因为 90% 的时间我不想要子实体,但在某些情况下也有可能立即获得整个层次结构。我不想通过使用命名查询来实现这一点,因为当我转换为例如时父子层次结构很有用JSON 格式。
我正在尝试加载我购买的与 Angular4 一起使用的管理员,但是我在配置项目以使用 Webpack 运行时遇到了一些问题: const routes: Routes = [ { "path"
我正在尝试使用 Angular2 来延迟加载一些模块。我可以让它工作,但是当我将它与 canActivateChild 一起使用时,它会阻止导航但加载模块,我不知道我是否需要做任何其他事情,但我只想加
在我对 Angular 的探索中,我发现了两种在另一个模块中使用一个模块的可能方法。 (引用angular-express-starter project) 方法一:在 imports 数组中声明它。
我在 NPM 中有一个模块功能。我可以这样加载这个模块: import { NgModule } from '@angular/core'; import { Routes, RouterModule
我有这样的东西: const routes: Routes = [ { path: ':path', component: SiteRoot, children: [ { pa
这是鸣叫者。 https://plnkr.co/edit/tsNlmRth4mRzz0svGWLK?p=preview 我在其中创建了两个模块,每个模块包含两个组件和一项服务。我希望服务在模块级别应该
我是一名优秀的程序员,十分优秀!