如何从AngularInMemoryWebApi的createDb结果中检索特定的强类型对象?

时间:2019-02-21 22:16:37

标签: angular api web-services

在Angular 7中开发应用程序时,我正在使用Angular-In-Memory-Web-Api模拟后端。我的FakeBackendService显示为:

import { Injectable } from '@angular/core';
import { InMemoryDbService, RequestInfo, ResponseOptions } from 'angular-in-memory-web-api';
import { Data } from './data';

@Injectable({
  providedIn: 'root'
})
export class FakeBackendService implements InMemoryDbService {

  dbData: Array<Data> = new Array(
    new Data(1, "Malcom", "09/11/1980", "Married"),
    new Data(2, "Reginald", "04/07/1992", "Single"),
  );
  constructor() { }

  createDb() {
    console.warn("createDb() CALLED");
    console.warn({ "tasks": this.dbData });
    return { "tasks": this.dbData }
  }
}

然后我有一个服务正在调用此服务,目的是返回一个强类型的可观察对象,如下所示:

  base_url: string = "/api/";
  tasks_endpoint: string = "tasks";

  constructor(private http: HttpClient) { }

  getTasks() : Observable<Data[]> {
    return this.http.get<Data[]>(this.base_url + this.tasks_endpoint);
  }

这不起作用,因为返回的数据实际上是一个对象,该对象的['tasks']值实际上将包含我要查找的格式化数据。我只是不确定如何破解get的结果以返回此特定数据。 Data 类本身是一个基本的poco,如下所示:

export class Data {
    public id: number;
    public name: string;
    public chosenDate: string;
    public optionSelected: string;

    public testme(): string {
        return "do i exist";
    }

    constructor(id: number, name: string, chosenDate: string, optionSelected: string) {
        this.id = id;
        this.name = name;
        this.chosenDate = chosenDate;
        this.optionSelected = optionSelected;
    }

}

我尝试过转换组件本身中的数据,但这似乎不起作用。此外,我觉得服务应该返回正确的数据,而组件不必担心它。

我是Angular的新手,但是我一直在做大量的研究,视频和教程。我现在还不太了解很多事情。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

这也取决于您的模块。另外,我建议为模型(例如您的一个Data)使用接口而不是类。

看看这个示例,可能会有所帮助: https://stackblitz.com/edit/example-angular-in-memory-web-api?file=app%2Fapp.component.ts

答案 1 :(得分:0)

尽管进行了为期2天的专门研究,甚至花费了数小时的常规研究,但在我细分以提出此问题后不到20分钟,我便找到了解决方案。请注意,我不确定这是否是一个好产品,但是它确实有效。

我以前已经发现过responseInterceptor方法。我当时遇到的问题是,它假定只有一组数据收集。是这样的:

  protected responseInterceptor(res: ResponseOptions, ri: RequestInfo): ResponseOptions {
    res.body = this.dbData;
    return res;
  }  

这可以工作并返回强类型的数据,但是如果我的createDb()方法返回了其他数据,例如:

  createDb() {
    return { "tasks": this.dbTasks, "schedules":this.dbSchedules }
  }

这意味着我只能返回1个数据集,因此必须一成不变。至少我就是这么想的。然后,我实际上将RequestInfo对象记录到控制台,看到它具有一个集合属性,其数据被强类型化。目前我的解决方案是:

  protected responseInterceptor(res: ResponseOptions, ri: RequestInfo): ResponseOptions {
    if (ri.resourceUrl.indexOf('tasks') > -1) {
      res.body = ri.collection;
    }
    return res;
  }