当在Angular Universal中使用路由带有查询参数时,服务可能会不可用。这是因为在服务器端渲染时,查询参数将被忽略,导致服务无法获取正确的数据。
要解决这个问题,我们可以使用Angular提供的transferState服务来在客户端和服务器之间传递查询参数。以下是一个示例解决方法:
首先,确保在应用程序的根模块中导入TransferState模块并添加到导入数组中:
import { BrowserModule, TransferState } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
@NgModule({
imports: [
BrowserModule.withServerTransition({ appId: 'your-app-id' }),
TransferState // 导入TransferState模块
],
// ...
})
export class AppModule { }
然后,在服务中使用TransferState服务来获取查询参数,并传递给服务方法:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { TransferState, makeStateKey } from '@angular/platform-browser';
@Injectable({
providedIn: 'root'
})
export class MyService {
constructor(
private http: HttpClient,
private transferState: TransferState // 注入TransferState服务
) { }
getDataFromServer(queryParam: string) {
const key = makeStateKey('my-data-' + queryParam); // 创建一个唯一的键
// 尝试从TransferState中获取数据
const data = this.transferState.get(key, null);
if (data) {
// 如果TransferState中有数据,则直接返回
return data;
} else {
// 否则,从服务器获取数据
return this.http.get('https://your-api-url.com/data?query=' + queryParam)
.pipe(
tap((responseData) => {
// 将获取的数据存储在TransferState中以备将来使用
this.transferState.set(key, responseData);
})
);
}
}
}
在上面的示例代码中,我们首先使用makeStateKey函数创建一个唯一的键,该键将用于存储和检索数据。然后,我们尝试从TransferState中获取数据,如果获取到数据则直接返回,如果没有则从服务器获取数据,并将获取到的数据存储在TransferState中以便以后使用。
通过使用TransferState服务,我们可以确保在服务器端渲染时,查询参数也能正确地传递给服务并获取正确的数据。