Angular 从我导航到router.events.subscribe内部的组件获取变量

Angular 从我导航到router.events.subscribe内部的组件获取变量,angular,angular2-routing,Angular,Angular2 Routing,我正在创建应用程序历史记录功能,需要从每个组件获取一个变量,该变量是在每个组件初始化时从http调用获得的 目前我只是订阅AppComponent中的router.events,如下所示 export class AppComponent { constructor(private router: Router, private historyService: HistoryService) { this.router.events .filter

我正在创建应用程序历史记录功能,需要从每个组件获取一个变量,该变量是在每个组件初始化时从http调用获得的

目前我只是订阅AppComponent中的router.events,如下所示

export class AppComponent {
    constructor(private router: Router, private historyService: HistoryService) {
        this.router.events
            .filter(e => e instanceof NavigationEnd)
            .subscribe((routerEvent) => {
                console.log('Storing History Entry: ', routerEvent);
                this.historyService.saveEntry(routerEvent);
            });
    }
}

我是否有办法从该组件下的每个组件获取一个变量,并将其传递给历史记录服务,以便历史记录可以包含该变量?

您可以在组件之间使用共享服务并使用该服务属性:

export class AppComponent {
    constructor(private router: Router, private historyService: HistoryService) {
        this.router.events
            .filter(e => e instanceof NavigationEnd)
            .subscribe((routerEvent) => {
                console.log('Storing History Entry: ', routerEvent);
                this.historyService.saveEntry( this.shared.service.getMyVar());
);
            });
    }
}
甚至可以直接从historyService调用getMyVar

共享服务

myVar:any;
getMyVar(){
 return this.MyVar;
}
setMyVar(value){
 this.myVar=value;
}
组件

this.sharedService.setMyVar(value)

另一种解决方案是使用本地存储,但如果用户禁用了本地存储,则会受到限制。如果它是一个固定值,则可以使用路由配置上的data属性为每个路由提供一些数据

{
    path: 'products',
    data: { someBitofInfo: 'info'},
    component: 'ProductComponent'
},
数据属性是只读的,因此只能将其用于固定值。但您可以为每个路径定义不同的固定值


如果这不是一个选项(数据不是固定的),那么您可以将该名称作为可选或查询参数添加到URL中。。。这样做的缺点是它会显示在地址栏中。但是,如果您不关心地址栏URL的外观,那么它将是您的一个选项。

好主意,但看起来我们无法保证路由器事件和组件生命周期挂钩之间的时间。是的,不幸的是,我实际上在uri中使用了一个唯一的id来获取该对象的信息,因此它对于每个路径都不是固定的。如果它在URL上,那么就从URL中提取它。订阅路由器事件时,您可以访问URL。这是URL中我有权访问的数字,我需要使用该数字从服务获取该对象的名称。编号是唯一标识符,但名称可能不唯一。我正在考虑再次从历史记录服务进行调用,我只是希望使用组件中已有的值,而不是进行另一次调用。您可以将名称作为可选参数或查询参数添加到URL中。。。这样做的缺点是它会显示在地址栏中。但是如果你不在乎你的地址栏URL是什么样子,那么它将是你的一个选择。很好!好主意,我不在乎url,因为这将是一个移动应用程序(使用Cordova),地址栏不可见。选择评论中的答案的协议是什么?