Angular: машинописный текст, выводящий ответ JSON как объектную модель, не работает

У меня проблема, когда я пытаюсь передать ответ json объекту, все свойства моего объекта являются строковыми, это нормально?

Вот мой запрос ajax:

public getSingle = (keys: any[]): Observable<Badge> => {
        return this._http.get(this.actionUrl + this.getKeysUrl(keys))
            .map((response: Response) => response.json() as Badge )
            .catch(this.handleError);
}

Вот моя модель значка:

    export interface Badge {
        badgeNumber: number;
        authorizationLevel: number;
        endOfValidity: Date;
    }

И вот здесь я вызываю сервисную функцию и сталкиваюсь с проблемой:

this._badgeService.getSingle(this.ids).subscribe(
      (badge: Badge) => {
        console.log(typeof(badge.endOfValidity)); // <-- returning string and not Date
      },
      error => console.log(error);
      });

person Imad El Hitti    schedule 03.09.2017    source источник
comment
as Badge — это утверждение, оно ничего не приводит. Вам нужно самостоятельно создать новый объект Badge из данных JSON.   -  person jonrsharpe    schedule 03.09.2017
comment
Ясно, не могли бы вы сказать мне в моем случае, как лучше всего это сделать?   -  person Imad El Hitti    schedule 03.09.2017


Ответы (1)


Как-то сложно объяснить:

Date — это класс, это означает, что значения типа Date необходимо создавать с помощью вызова конструктора. Другими словами, создайте экземпляр класса с new Date(...).

Метод Response.json будет возвращать объект только в формате JSON, и он не содержит экземпляра какого-либо класса, а только карты ключ: свойство.

Итак, что вам нужно сделать, это вручную преобразовать значение, возвращаемое из .json(), в базовый объект. Это можно сделать следующим образом:

public getSingle = (keys: any[]): Observable<Badge> => {
        return this._http.get(this.actionUrl + this.getKeysUrl(keys))
            .map(r => r.json())
            .map(v => <Badge>{
              badgeNumber: v.badgeNumber,
              authorizationLevel: v.authorizationLevel,
              endOfValidity: new Date(v.endOfValidity)
              // preferably this string should be in ISO-8601 format
             })
            //the mapping step can be done in other ways most likely
            .catch(this.handleError);
}
person Jota.Toledo    schedule 03.09.2017
comment
Я вижу проблему, она более ясна на самом деле. Я попробовал ваше решение и работал как шарм, но есть ли способ сделать это из моих компонентов, когда я вызываю метод? Поскольку мой класс обслуживания является универсальным, объект может быть чем угодно. - person Imad El Hitti; 03.09.2017
comment
если вы все еще хотите вернуть Observable‹Badge› из своего сервиса без ручного сопоставления, вам нужно изменить тип endOfValidity на строку и манипулировать объектом, как вам нравится в компоненте. - person Jota.Toledo; 03.09.2017
comment
Привет, @Jota.Toledo, что это за getKeysUrl? Почему 2 URL? Я получаю список объектов json из 1 URL-адреса, для чего нужен другой? - person Daniel Bezerra De Menezes; 07.10.2017