Angular автоматически разрешает строки как даты - PullRequest
0 голосов
/ 11 октября 2019

У меня есть группа сущностей, которые я объявил:

export class Meeting implements IHasId {
    id = 0;
    locationId = 0;
    meetTime = new Date();
    isFinalized = false;
    imageId: number = null;
    description = '';
    name = '';
}

У меня есть универсальный сервис crud, который обрабатывает преобразование их в свой первоначальный тип

export class ApiResourceBaseService<T extends IHasId> {
  get(id: number): Observable<T> {
    return this.http.get<T>(`${this.apiUrl}/${this.route}/${id}`);
  }
}

Типизированные шрифты толькоповерхностно, поэтому, когда я звоню get<T> машинопись, предполагается, что мой json верен. Однако объекты Моя дата не разрешаются должным образом, они разрешаются как строки.

У меня есть несколько сущностей. Было бы неудобно создавать собственные конструкторы / адаптеры для разбора дат.

У кого-нибудь есть идея для автоматического разрешения дат?

1 Ответ

1 голос
/ 12 октября 2019

Я создал перехватчик для преобразования данных. В будущем я, вероятно, просто буду автоматически генерировать свои модели и ресурсы API из документации API и избегу этого, но сейчас я просто использую этот хак:

export class ModelBinderInterceptor implements HttpInterceptor {

    // regex of ISO 8601 Date.
    DATE_TIME_TIMEZONE_REGEXP =
    /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;

    constructor() {
    }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        return next.handle(req).pipe(tap((event: HttpEvent<any>) => {
            if (event instanceof HttpResponse) {
                event = event.clone({body: this.modifyBody(event.body)});
            }
            return event;
        }));

    }

    private modifyBody(body: any) {
        return this.deserializeDates(body);
    }

    private deserializeDates(obj) {
        if ((!(obj instanceof Object)) || (isString(obj))) {
            return obj;
        }

        for (const key of Object.keys(obj)) {
            const value = obj[key];
            let date;

            if (isString(value) &&  (this.DATE_TIME_TIMEZONE_REGEXP.test(value))) {
                date = new Date(value);
                // the parsing above may fail, in which case we use isNaN to check if the date is valid
                if (isNaN(date.getTime())) {
                    return;
                }
                obj[key] = date;
            }
            this.deserializeDates(value);
        }

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