【发布时间】:2021-11-23 09:42:55
【问题描述】:
我有一个 Angular (v12) 服务,通过httpClient 请求进行 API 调用,我还想在其中放置一个方法来检查对象是否已经存在于后端级别(在它到达之前,但当然那里也有安全措施)。
所以我要做的是触发 http get,然后将答案传递给一个方法来丰富它并将结果存储在一个私有属性 (visaDatesList) 中,该属性应该保存我的对象列表。
当我的组件调用getAllVisaDates() 方法时,该列表正在被输入,我可以使用console.log 确认...
下面是我的服务代码的一部分:
@Injectable({
providedIn: 'root'
})
export class VisasService{
private visaDatesList: VisaDate[] = [];
constructor(private httpClient: HttpClient) {}
public getAllVisaDates(): Observable<VisaDateAnswer> {
return this.httpClient
.get(`${this.baseUrl}/visa-dates`, { observe: 'response' })
.pipe(map(this.getVisaDates));
}
public checkIfVisaDoesNotAlreadyExists(visa: VisaDate): boolean {
console.log(this.visaDatesList);
let matchedYear = false;
let matchedMonth = false;
for (const entry of this.visaDatesList) {
for (const [key, value] of Object.entries(visa)) {
if (key === 'visaYear' && value === visa.visaYear) {
matchedYear = true;
}
if (key === 'visaMonth' && value === visa.visaMonth) {
matchedMonth = true;
}
if (matchedMonth && matchedYear) {
return false;
}
}
matchedYear = false;
matchedMonth = false;
}
return true;
}
private getVisaDates(res: HttpResponse<VisaDate[]>) {
const header = res.headers.get('x-visaapp-params');
const data = res.body;
this.visaDatesList = res.body as VisaDate[];
return { size: header, data, status: res.status };
}
}
正如我所说,这里的重点是,在我的 getVisaDates() 方法中,使用 console.log,我可以看到我的列表 visaDatesList 已正确输入。
问题在于checkIfVisaDoesNotAlreadyExists() 方法。由于某种原因,当另一个组件调用该服务时,该列表被视为空,即使我之前的 console.log(在 getVisaDates() 中)正在显示数据......如果我没记错的话,服务应该是单例,并且存储要在组件之间共享的数据应该是使用它们的正确方法吗?
也许我在这里遗漏了一些明显的东西,但我不能让这个工作,有什么想法/帮助吗?
谢谢!
【问题讨论】:
-
你是如何定义服务的?在
module.ts,你在provider: [VisasService]有吗?在你的 'component, do you have it in the annotation@Component` 或constructor?你应该看看stackoverflow.com/questions/53571546/… -
在组件中你是否在组件提供者中提供服务,如果是,他们不会是单例的
-
@Pilpo :是的,我的组件有组件装饰器,我在每个组件的构造函数中注入服务,作为构造函数(私有 visaService:VisasService),我相信这工作正常,但感谢指点这种可能性!
-
@vaira:真的!如上所述,我想到了这一点,只是注射,但感谢您的建议