【发布时间】:2016-09-02 22:23:50
【问题描述】:
我有一个应用程序,其路由如下所示:
/:partner/login
/:partner/tools
/:partner/other
目前使用2.0.0-rc.5,我可以非常简单地构建看起来与上面完全相同的路线。但是,这种方法的缺点是每个组件都必须自己提取partner 参数。所以login 路径声明看起来像:
{
path: ':partner/login',
component: LoginComponent
}
LoginComponent 看起来像:
export class LoginComponent implements OnInit {
partner: string;
constructor(private _route: ActivatedRoute) { }
ngOnInit() {
this._route.params.forEach(p => {
this.partner = p[`partner`];
});
}
}
虽然这可以通过 3 条路线进行管理,但从概念上讲,我真正想说的是我有一个 PartnerComponent,它有子路线 login、tools 等。
路由看起来像这样:
{ path: ':partner', component: PartnerComponent
children: [
{ path: 'login', component: LoginComponent},
{ path: 'tools', component: ToolsComponent}
]
}
并且使用 TypeScript 的继承,我可以为每个子组件创建一个基本组件,例如:
export class BaseComponent implements OnInit {
partner: string;
constructor(private _route: ActivatedRoute) { }
ngOnInit() {
this._route.parent.params.forEach(p => {
this.partner = p[`partner`];
});
}
}
子组件看起来像:
export class LoginComponent extends BaseComponent {
constructor(route: ActivatedRoute) {
super(route);
}
ngOnInit() {
super.ngOnInit();
}
}
虽然上述方法可行,但查找父路由感觉有点脏。我知道如果我改变层次结构,我只需要在基础中改变它,但仍然
是否有更简洁的方式在父路由组件和其子路由组件之间共享信息。
如果它是更传统的父元素/子元素关系,我们将简单地使用两者之间的数据绑定来传递该信息。
【问题讨论】:
-
组件数据绑定是不可能的吗?我真的不认为
partner是一个组件,而是作为数据。拥有partner的组件能否通过数据绑定将其传递给子级(即login、tools、`other)? -
@KevinLe AFAIK,路由器是解析 URL 和提取参数的支持方式。你是对的,就目前而言,
PartnerComponent除了<router-outlet>标签之外真的没有太多其他东西。但是,从长远来看,我可以看到这会演变并变得更加复杂。 -
嗯,仍然不确定您是否需要为
partner解析 url 本身。我在下面发布了一个答案,看看它是否对你有帮助!不过,您可能已经探索过了。 -
查看stackoverflow.com/a/39031152/1810391。无需传递父 id,只需在两侧硬编码相同的 shareObj id。您也可以探索方法 2。