1

到现在为止,我一直在做下面的订阅的值赋给我的班属性:分配值,而不突变

export class ExampleComponent implements OnInit { 
    exampleId: string; 

    constructor(public route: ActivatedRoute) { 
    this.route.params.subscribe((params: Params) => this.exampleId = params.id); 
    } 

    ngOnInit() { 
    // Do something with exampleId here... 
    } 
} 

在努力摆脱突变,更多地转向不变性;我希望将该订阅返回的值分配给exampleId属性,而无需在构造函数中这样做。

什么是最好的方式去做这件事?

+0

你可以在OnInit生命周期中做到这一点 –

+0

这仍然会改变原来的属性定义。我需要在创建属性时分配值。 –

+0

有一个快照替代获取路径参数,而不使用可观察的订阅[链接](https://angular.io/guide/router#snapshot-the-no-observable-alternative) –

回答

1

您从构造函数中产生的任何异步请求意味着您的Component不会是不可变的:它必须有两个状态;数据解决之前和之后。

因此,如果您想要一个不可变的组件,您必须将异步部件移出Component并在构造之前获取数据。对于您给出的示例,可以在路由配置中使用路由解析服务和resolve对象。然后,路由器将在组件实例化之前解析数据,并可通过ActivatedRouteSnapshot.data访问该数据。

对于更一般情况下,当该类依赖于异步数据时,使任何类不可变,您需要某种类型的工厂来解析数据并使其可用于构建类(这里的路由器是工厂) 。