【问题标题】:angular list in service becomes empty服务中的角度列表变为空
【发布时间】: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:真的!如上所述,我想到了这一点,只是注射,但感谢您的建议

标签: angular list service


【解决方案1】:

您在getVisaDates() 中丢失了this 关键字的上下文,因为它是作为具有自己范围的回调传递的。因此,当您尝试 this.visaDatesList = res.body as VisaDate[]; 时,不一定要将值分配给类成员变量 visaDatesList

您要么需要使用bind(this)

return this.httpClient
  .get(`${this.baseUrl}/visa-dates`, { observe: 'response' })
  .pipe(map(this.getVisaDates.bind(this)));

或者使用箭头函数

return this.httpClient
  .get(`${this.baseUrl}/visa-dates`, { observe: 'response' })
  .pipe(map((res: HttpResponse<VisaDate[]>) => this.getVisaDates(res)));

您可以找到有关在回调 here 中使用 this 关键字的更多信息。

【讨论】:

  • 我相信我还有很多东西要学习 Angular,非常感谢您的回答,我必须彻底阅读您链接的消息,绑定成功了,但使用箭头似乎也相关,无论如何我的问题已经解决了,再次感谢!
猜你喜欢
  • 2020-05-19
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
相关资源
最近更新 更多