Angular 5, HttpClient не будет использовать конструктор класса - PullRequest
0 голосов
/ 10 мая 2018

У меня есть сервис и компонент.

some.service.ts

import { Injectable } from '@angular/core';
import { HttpClient} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

import { SomeClass } from '../model/some.class';

@Injectable()
export class SomeService {

    constructor(private http: HttpClient) {}

    getData(): Observable<SomeClass[]> {
        let url = 'someUrlEndpoint';
        let results = this.http.get<SomeClass[]>(url);
        return results;
    }

}

some.component.ts

import { SomeService } from './service/some.service';

import { SomeClass } from './model/some.class';

export class SomeComponent {

    someClass: SomeClass[];

    constructor(private someService: SomeService)

    ngOnInit() {
        this.getData()
    }

    getData() {
        this.someService.getData()
          .subscribe(res => this.someClass = res);
    }
}

some.class.ts

export class SomeClass {
    title: string;
    status: string;
    numberOfPersons: number;
    persons: string;
    ...

    constructor(json: any = "") {
        this.title = json.title;
        this.status = getStatus(json.status);
        this.numberOfPersons = getNumberOfPersons(json.persons);
        this.persons = json.persons;
        ...
    }

    getStatus(value: number) {
        let status = StatusCase.ongoing;
        if(value == 1) {status = StatusCase.done}
        if(value == 2) {status = StatusCase.completeWithDeviations}
        if(value == 3) {status = StatusCase.aborted}
        return status;
    }

    getPersons(value: string) {
        let persons = 0;
        get persons splitted by comma, count it up and return
        return persons;
    }
}

export enum StatusCase {
    ongoing = "Ongoing";
    aborted = "Aborted";
    completeWithDeviations = "Complete with deviations";
    done = "Done";
}

Я могу получить данные, но не так, как я хочу.

Теперь, поскольку httpClient не возвращает экземпляр SomeClass, он не будет проходить через конструктор, и приложение не получит правильные данные, которые ему нужны. Итак, где вписывается «новый SomeClass (данные)»? Можно ли вообще сделать так, как устроен httpClient? Или я должен получить нетипизированные данные (json) и выполнить цикл for для заполнения someClass: SomeClass [] традиционным способом?

Или существует другой более разумный способ заполнения вычисляемых свойств? Использовать перехватчики для манипулирования данными в ответе? Кажется, однако, что перехватчики в ответе только для ошибок.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете использовать такую ​​библиотеку, как преобразователь классов , чтобы достаточно просто отобразить простой javascript HTTP-ответа в объекты вашего класса:

// assuming that your json response from the http call is an array
const obs: Observable<SomeClass[]> = this.http.get(url).map(res => 
   plainToClass(SomeClass, res));
0 голосов
/ 11 мая 2018

.get<SomeClass[]> Ничего не делает. Это полезно только при разработке. Вы можете запустить оператор карты и вернуть экземпляр класса.

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