Как получить определенный строго типизированный объект из результата createDb AngularInMemoryWebApi? - PullRequest
0 голосов
/ 22 февраля 2019

Я использую Angular-In-Memory-Web-Api для макета бэкэнда при разработке приложения на Angular 7. Мой 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, чтобы вернуть эти конкретные данные.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Я пытался преобразовать данные в самом компоненте, но это не работает.Кроме того, я чувствую, что сервис должен возвращать правильные данные, и компонент не должен беспокоиться об этом.

Я новичок в Angular, но я провел массу исследований, видео,и учебники.Есть множество вещей, которые я не совсем понимаю прямо сейчас.

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Несмотря на 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;
  }
0 голосов
/ 22 февраля 2019

Это зависит от того, что находится на вашем модуле.Также я бы порекомендовал использовать интерфейсы вместо классов для моделей (таких как ваши Data).

взгляните на этот пример, может помочь: https://stackblitz.com/edit/example-angular-in-memory-web-api?file=app%2Fapp.component.ts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...