【问题标题】:Conditional routing configuration条件路由配置
【发布时间】:2016-05-27 22:42:26
【问题描述】:

我想要一个响应式应用程序。它应该在小屏幕(一系列屏幕以深入了解详细信息页面)和大屏幕(左侧面板 + 单个页面上的详细信息)上具有不同的导航。

实际上,我想加载不同的组件并根据屏幕/窗口大小进行不同的路由配置。而且我希望能够在它们之间动态切换,因为窗口的大小被调整到高于/低于某个阈值。

由于 Angular2 中的路由是在组件级别定义的,我的想法是创建一个根级别组件,它会有条件地 (ngIf) 包含 bigScreen.component.ts 或 smallScreen.component.ts。然后将在 bigScreen/smallScreen 组件中定义路由本身。这似乎不起作用。

我创建了一个plunk 来展示。它基本上是 Angular 教程中英雄导航的副本。我创建了附加组件 app/container.component.ts 作为根组件引导。然后嵌入 AppComponent(教程中的根组件),其中包含路由配置。

这会在控制台上产生错误:

Error: Component "AppContainer" has no route config.

如果嵌套组件有导航配置,我必须在我的根组件中创建导航配置。有没有办法解决它来实现我所需要的?还是应该以不同的方式实现响应式路由?

【问题讨论】:

  • 我有同样的问题,偶然发现了这篇文章,如果你找到了解决方案,请告诉我。提前致谢。自从这篇文章以来已经有很长时间了,所以希望 Angular 2 现在支持它开箱即用,但无法弄清楚。

标签: angular angular2-routing


【解决方案1】:

在新路由器(>= RC.3)https://angular.io/docs/js/latest/api/router/index/Router-class.html#!#resetConfig-anchorresetConfig可以使用

router.resetConfig([
 { path: 'team/:id', component: TeamCmp, children: [
   { path: 'simple', component: SimpleCmp },
   { path: 'user/:name', component: UserCmp }
 ] }
]);

您可能需要一个虚拟配置来在应用启动时初始化路由器,或者使用How to pass parameters rendered from backend to angular2 bootstrap method 延迟初始化,直到准备好路由配置。

https://github.com/angular/angular/issues/11437#issuecomment-245995186 提供了一个RC.6 Plunker

【讨论】:

  • 感谢您的提示。但它对我不起作用。重置配置似乎重新加载了路线定义,以便后续导航使用新设置。但不影响当前显示的组件树。而且我需要实时重新加载,以便显示调整到屏幕尺寸的组件。文档的链接已损坏。新的是angular.io/docs/ts/latest/api/router/index/…
【解决方案2】:
let routeMobile = [{path:'/', name: 'Home', component: MobileHomeComponent},
  {path:'/hero/:id',      name: 'Detail',   component: detailComponent}];

let routeDesktop = [{path:'/', name: 'Home', component: DesktopComponent}]

function checkForMobile(){
  //returns true for mobile
}
let finalRoute = checkForMobile() ?  routeMobile : routeDesktop;  

@Component({ ... })
@RouteConfig(finalRoute)
export class AppComponent { }

如果您也非常希望它具有响应性,只需在 "resize" 事件上重新加载页面即可。

【讨论】:

  • 感谢@GauravMukherjee 的回答。调整大小时重新加载对我来说是不行的。似乎我有三个选择:实现一个服务来检测位置变化和使用 ngIf 的视图逻辑,实现我自己的路由器或使用另一个框架(例如 Aurelia),在那里可以动态切换路由。我有点失望 Angular2 不支持这种开箱即用的场景。
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多