加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Angular 2中与子路径共享信息?

发布时间:2020-12-17 18:05:20 所属栏目:安全 来源:网络整理
导读:我有一个应用程序,其路由将如下所示: /:partner/login/:partner/tools/:partner/other 目前使用2.0.0-rc.5,我可以非常简单地构建完全如上所述的路由.但是,这种方法的缺点是每个组件都必须自己提取伙伴参数.所以登录路径声明看起来像: { path: ':partner/lo
我有一个应用程序,其路由将如下所示:

/:partner/login
/:partner/tools
/:partner/other

目前使用2.0.0-rc.5,我可以非常简单地构建完全如上所述的路由.但是,这种方法的缺点是每个组件都必须自己提取伙伴参数.所以登录路径声明看起来像:

{
    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,它有子路由登录,工具等.
路由看起来像这样:

{ 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();
    }
}

虽然上述工作,但查找父路线感觉有点脏.我知道如果我改变了层次结构,我只需要在基础中更改它,但仍然如此

是否有更简洁的方法在父路由组件之间共享信息.

如果它是一个更传统的父元素/子元素关系,我们只需使用两者之间的数据绑定来传递该信息.

解决方法

您可以做的是为父路线使用Resolve防护,因此将为任何:伙伴路线加载数据.

一个Resolve看起来像:

import { Injectable }             from '@angular/core';
import { Router,Resolve,ActivatedRouteSnapshot } from '@angular/router';

import { Partner } from './partner.model';
import { Api } from './api.service';

@Injectable()
export class PartnerResolve implements Resolve<Partner> {
  constructor(private api: Api,private router: Router) {}

  resolve(route: ActivatedRouteSnapshot): Observable<Partner> {
    let id = +route.params['partner'];

    return this.api.getPartner(id);
  }
}

然后,您的路线需要包含PartnerResolve,以便在请求数据并且可用之前不会加载:

{
  path: ':partner',component: PartnerComponent,resolve: {
    partner: PartnerResolve
  },children: [
    { path: 'login',component: ToolsComponent},]
}

而你的PartnerComponent只会得到它:

ngOnInit() {
  this.route.data.forEach((data: { partner: Partner }) => {
    this.partner = data.partner;
  });
}

您的子组件将使用:

ngOnInit() {
  this.route.parent.data.forEach((data: { partner: Partner }) => {
    this.partner = data.partner;
  });
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读