Angular 带独立模的角分辨

Angular 带独立模的角分辨,angular,routing,angular-routing,ng-modules,Angular,Routing,Angular Routing,Ng Modules,如何在另一个模块中激活子路由的RouteGuard或Resolve 示例场景: 我有一个应用程序,它有许多独立的模块,每个模块定义自己的路径。考虑这些模块定义以下路由: Module1 -> ['/a', '/b', '/c'] Module2 -> ['/d', '/e', '/f'] 现在,我需要确保应用程序中的每个路由都有以下解决方案: resolve: { config: AppConfiguration} 我们可以使用: { path: '', component:

如何在另一个模块中激活子路由的RouteGuard或Resolve

示例场景: 我有一个应用程序,它有许多独立的模块,每个模块定义自己的路径。考虑这些模块定义以下路由:

Module1 -> ['/a', '/b', '/c']
Module2 -> ['/d', '/e', '/f']
现在,我需要确保应用程序中的每个路由都有以下解决方案:

resolve: { config: AppConfiguration} 
我们可以使用:

{ path: '',  component: AppComponent, resolve: { config: AppConfiguration}  }
但是,它什么也没有实现-
/
执行解析器,但是
/a
没有

我发现确保路由
/a
/b
/c
调用解析程序的唯一方法是将它们设置为根的子级,如下所示:

AppModule -> [ { path: '', component: 'MainComponent', resolver: {..}, children: [
    ...Module1Routes
    ...Module2Routes
] ]}
但这样做意味着应用程序不再以Angular文档推荐的方式构造,
RouterModule.forChild()
不再在其他模块中使用


我确信这是一个非常常见的用例-有更好的方法吗?

因为
AppConfiguration
应该是所有路由共享的单例,所以有两种常见的模式可以做到这一点

考虑到解析程序的一个主要优点是访问从异步解析程序中解包的数据,即
activatedRoute.snapshot.data.resolverName
,一种方法是使用由所有解析程序解包的单例服务,例如:

@Injectable()
class Config {
  data: IConfig;
  data$: Observable<IConfig>;

  constructor(private http: Http) {}

  load(forceReload = false) {
    if (!this.data$ || forceReload) {
      this.data$ = this.http.get('...')
      .map(res => res.json())
      .do(data => {
        this.data = data
       })
      .publishReplay(1)
      .refCount();
    }

    return this.data$;
  }
}
可以设置代码干燥器,并提供一个函数或类来为所有路由添加
config
resolver,但不建议这样做,因为这种方法与AoT不兼容。在这种情况下,越湿越好

另一种方法是使用,详细说明见。当路由解析程序延迟路由更改时,
APP_初始值设定项
以相反的方式工作并延迟应用程序初始化

它是多提供程序,应在根注入器中定义:

export function configInitializerFactory(config: Config) {
  return () => config.load();
}

@NgModule({
  ...
  providers: [
    ...
    Config,
    {
      provide: APP_INITIALIZER,
      useFactory: configInitializerFactory,
      deps: [Config],
      multi: true
    }
  ]
})
...
不需要涉及任何解析程序,因为数据在应用程序初始化期间已解析


幸运的是,
data$
observable已经在
Config
中被解包为
data
,所以解析数据已经可以作为
Config.data

注入了,这是为什么Config是一个解析程序呢?是否应该在每次路由更改时重新实例化它?我有另一种情况是有意义的-必须更改变量名,因为它是超级机密的东西:)此外,如果它位于根目录中,那么目标是不要在每次路由更改时重新实例化它,而是在加载根目录时加载一次(即,当我按F5或重新启动应用程序时)所以从/a到/b到/c将调用解析程序一次,但我仍然可以转到/c,它将调用解析程序。将解析器分别连接到每个路由将调用它三次。是的,
children
就是这样做的。但是,如果您想让它们成为功能模块并使用
forChild
,那么整个想法就不一样了——您将东西与根模块分离,但您尝试通过公共解析器再次将它们耦合起来。没什么意义。@David是的,APP_初始值设定项很好。我猜您是根据A1的经验判断的,路由解析器是延迟初始化进程的唯一方法。幸运的是,这在A2中得到了修复。
export function configInitializerFactory(config: Config) {
  return () => config.load();
}

@NgModule({
  ...
  providers: [
    ...
    Config,
    {
      provide: APP_INITIALIZER,
      useFactory: configInitializerFactory,
      deps: [Config],
      multi: true
    }
  ]
})
...