【问题标题】:Disable application loading/routing in Angular2在 Angular2 中禁用应用程序加载/路由
【发布时间】:2016-09-14 18:31:56
【问题描述】:

我有一个 angular2 应用程序(RC6 版本),其中一些重要的全局参数是使用在启动时收集此文件的服务从配置文件加载的:

@NgModule({
imports:  [ BrowserModule, FormsModule, HttpModule, AppRoutes, SomeCustomModule ],
declarations: [ AppComponent ]
providers: [
            ConfigurationService,
            {
              provide: APP_INITIALIZER,
              useFactory: (config: ConfigurationService) => () => { 
                             return config.load().then(configParams=> { return true;});      
                          },
              deps: [ConfigurationService, HttpModule],
              multi: true
            }
          ],
bootstrap:[ AppComponent ]
})
export class AppModule { }

正如这个 sn-p 所示,我使用我称之为 ConfigurationService 的东西,它通过 http 调用读取配置文件并返回一些参数(作为 Promise)。如果一切顺利,应用程序会完美加载,并且这些配置参数可以在整个子模块等中访问。

问题是,如果此配置文件未按预期加载,我如何阻止应用程序加载子模块? (请注意,AppComponent 本质上只是一个路由器出口,重定向到由多个子模块定义的其他路由)。我可以“禁用”或重定向到错误页面,而不是加载请求路由定义的模块/组件吗?

【问题讨论】:

  • 在 AppComponent 检查参数。如果它们符合预期,让应用程序运行 else 路由到错误页面...
  • 是的,但是在哪里? AppComponent 模板就是<router-outlet></router-outlet>。我试图用 *ngIf 封装它,但收到错误“错误:找不到加载 ChildComponent 的主要出口”你的意思是添加一个 ngOnInit() 函数并在其中执行检查吗?

标签: angular configuration angular2-router


【解决方案1】:

要禁用页面的初始路由,并让它根据您的ConfigurationService 进行处理,您必须在您的AppRoutes 对象中将initialNavigation 设置为false

export const AppRoutes = RouterModule.forRoot(ROUTES, {initialNavigation : false});

在您的 ConfigurationService 中,您必须注入 router 并根据您的配置使用它来导航。

另一种选择是使用canActivate 路由挂钩。在这个钩子中,您可以注入ConfigurationService 并让它确定它是否可以加载此页面。


更新

对于最新版本的 Angular,initialNavigationfalse 值已弃用,请改用 'disabled'

{ initialNavigation : 'disabled' }

【讨论】:

  • 谢谢,我不知道{initialNavigation : false} 选项
  • +1 很棒的 Angular 团队的一个很棒的功能,感谢您让我们知道,任何文档/参考链接..?
  • @PankajParkar 我添加了一个指向 api 的链接。我认为它还没有在文档中
  • @PierreDuc 谢谢伙计,这也会对其他人有所帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2018-07-15
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多