0

我的角度应用程序有问题。我必须调用从 url 读取一些参数的服务。它不起作用,因为在订阅完成参数之前触发了该服务。在我的服务文件中,我有这个:

constructor(private http: HttpClient, private route: ActivatedRoute) { 
    this.route.queryParams.subscribe(params => {
      this.param1 = params['param1'];
      this.param2 = params['param2'];
    });
  }

然后是服务:

getConfigs() {
    let configPath = baseUrl + this.param1 + "/" + this.param2;
    return this.http.get<any>(configPath);
  }

因此,在我的服务中,AppComponent我调用了该getConfigs()服务,但它不起作用,因为这两个参数未定义。我该如何解决?这就是我调用服务的方式AppComponent

this.service.getConfigs().subscribe((configData) => {
      this.configParams = configData;
    });
4

3 回答 3

2

您可以使用 RxJS 高阶映射运算符,例如switchMap链接相互依赖的 observables。尝试以下

constructor(private http: HttpClient, private route: ActivatedRoute) { }

getConfigs() {
  return this.route.queryParams.pipe(
    switchMap(params => {
      let configPath = baseUrl + params['param1'] + "/" + params['param2'];
      return this.http.get<any>(configPath);
    })
  );
}

虽然我会说最好在组件而不是服务中获取路由参数。所以你可以做如下的事情

服务

constructor(private http: HttpClient) { }

getConfigs(param1: any, param2: any) {
  const configPath = baseUrl + param1 + '/' + param2;
  return this.http.get<any>(configPath);
}

零件

constructor(private someService: SomeService, private route: ActivatedRoute) { }

ngOnInit() {
  this.route.queryParams.pipe(
    switchMap(params => this.someService.getConfigs(params['param1'], params['param2']))
  ).subscribe(
    ...
  );
}
于 2020-09-17T15:43:42.950 回答
1

从路由器获取查询参数,并使用first()运算符仅获取第一个事件,然后使用switchMap()params 选项获取数据。

  constructor(
    private _http: HttpClient,
    private _route: ActivatedRoute,
  ) { }

  getConfigs() {
    return this._route.queryParams.pipe(
      // rxjs operator skip empty object
      filter(params => !!Object.keys(params).length),
      // rxjs operator use only first event
      first(),
      // rxjs operator switch to another observable
      switchMap(params => this._http.get('host', { params })),
    );
  }
于 2020-09-17T15:56:22.420 回答
0

您需要将值传递给服务。

this.service.getConfigs(this.param1, this.param2).subscribe((configData) => {
      this.configParams = configData;
});

getConfigs(param1, param2) {
    let configPath = baseUrl + param1 + "/" + param2;
    return this.http.get<any>(configPath);
  }
于 2020-09-17T15:42:17.960 回答