Angular 获取查询参数并调用服务
Angular get query param and call service
我的 angular 应用程序出现问题。我必须调用服务从 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;
});
您需要将值传递给服务。
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);
}
您可以使用像 switchMap
这样的 RxJS 高阶映射运算符来链接 co-dependent 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(
...
);
}
从路由器获取查询参数,并使用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 })),
);
}
我的 angular 应用程序出现问题。我必须调用服务从 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;
});
您需要将值传递给服务。
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);
}
您可以使用像 switchMap
这样的 RxJS 高阶映射运算符来链接 co-dependent 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(
...
);
}
从路由器获取查询参数,并使用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 })),
);
}