Angular 2 路由:父级处理参数
Angular 2 Routing: Parent Handling Parameter
我 运行 我的 Angular 2 路由出错了。 (使用 angular/router2.0.0-rc1)
路线如下:
tabs/editItem (For creating a new item)
tabs/id/editItem (For editing an item)
tabs/id/itemStuff
tabs/id/differentStuff
在我的选项卡组件上,我需要在没有提供 ID 时禁用 itemStuff 和 differentStuff 选项,但在有 ID 时启用。
我在模板的 ID 上使用了 NgIf 并且:
routerOnActivate(curr: RouteSegment) {
if(curr.getParam('pId') == null)
return;
this.pId = +curr.getParam('pId');
}
问题是我无法从我的选项卡页面访问路由参数,因为 "routerOnActivate" 仅在路由端点调用。看起来一个选项是让子元素为我做检查,然后发回一个事件让 Tabs 组件更新,但这看起来很丑陋而且不是正确的方法。
感谢任何帮助!
TLDR:父组件如何访问和处理参数
首先,您最好升级您的项目,以便使用路由器的 v3。 v2 路由器不再开发,v3 路由器的工作方式与 v2 路由器完全不同。
至于你的 parent/child 参数问题,不幸的是你会遇到一些与 v3 相同的问题,即子路由没有给父参数。它们通过一个新的可注入路由器组件 ActivatedRoute
交付,该组件仅包含给定路由的参数,而不是其父项或子项。
此行为似乎是设计使然,这意味着您将需要处理 'own' 该参数的组件中的参数,然后通过单独的服务将这些参数提供给其他父/子路由。
至于解决方法,我还没有看到任何直接通过路由器组件执行此操作的方法,但我想说随着路由器 API 的不断变化,解决方法可能不会一个稳定的选择。
我猜想虽然这似乎是一种错误的做事方式并且更加困难,但它是一种强大的关注点分离,在大型项目中将使您的项目在长期内更加健壮 运行.
希望对您有所帮助!
恢复这个因为我刚刚 运行 进入这个问题。您应该能够通过爬上 ActivatedRoute 树从父级获取属性。
getId(route: ActivatedRouteSnapshot){
let id = route.params["id"];
if(id)
{
return id;
}
if(route.parent)
{
return this.getId(route.parent)
}
return undefined;
}
我 运行 我的 Angular 2 路由出错了。 (使用 angular/router2.0.0-rc1)
路线如下:
tabs/editItem (For creating a new item)
tabs/id/editItem (For editing an item)
tabs/id/itemStuff
tabs/id/differentStuff
在我的选项卡组件上,我需要在没有提供 ID 时禁用 itemStuff 和 differentStuff 选项,但在有 ID 时启用。
我在模板的 ID 上使用了 NgIf 并且:
routerOnActivate(curr: RouteSegment) {
if(curr.getParam('pId') == null)
return;
this.pId = +curr.getParam('pId');
}
问题是我无法从我的选项卡页面访问路由参数,因为 "routerOnActivate" 仅在路由端点调用。看起来一个选项是让子元素为我做检查,然后发回一个事件让 Tabs 组件更新,但这看起来很丑陋而且不是正确的方法。
感谢任何帮助!
TLDR:父组件如何访问和处理参数
首先,您最好升级您的项目,以便使用路由器的 v3。 v2 路由器不再开发,v3 路由器的工作方式与 v2 路由器完全不同。
至于你的 parent/child 参数问题,不幸的是你会遇到一些与 v3 相同的问题,即子路由没有给父参数。它们通过一个新的可注入路由器组件 ActivatedRoute
交付,该组件仅包含给定路由的参数,而不是其父项或子项。
此行为似乎是设计使然,这意味着您将需要处理 'own' 该参数的组件中的参数,然后通过单独的服务将这些参数提供给其他父/子路由。
至于解决方法,我还没有看到任何直接通过路由器组件执行此操作的方法,但我想说随着路由器 API 的不断变化,解决方法可能不会一个稳定的选择。
我猜想虽然这似乎是一种错误的做事方式并且更加困难,但它是一种强大的关注点分离,在大型项目中将使您的项目在长期内更加健壮 运行.
希望对您有所帮助!
恢复这个因为我刚刚 运行 进入这个问题。您应该能够通过爬上 ActivatedRoute 树从父级获取属性。
getId(route: ActivatedRouteSnapshot){
let id = route.params["id"];
if(id)
{
return id;
}
if(route.parent)
{
return this.getId(route.parent)
}
return undefined;
}