Автоматически конвертировать формат строки даты для post API - PullRequest
0 голосов
/ 09 мая 2018

Мой проект включает в себя много полей даты. Время отправки запроса Api, формат, требуемый сервером "YYYY-MM-DD" Но формат, который я хочу показать в интерфейсе: «ДД-ММ-ГГГГ»

Я знаком с библиотекой моментов и ее функциями для преобразования даты в строку и наоборот и другими функциями.

Я не хочу выполнять процесс конвертации для каждого поля даты. (изменение компонента по моментам библиотеки).

Есть ли что-нибудь, с помощью чего я могу выполнить мое требование.

У меня нет проблем с привязкой ввода к тексту string

В интерфейсе пользователя должно отображаться: ДД-ММ-ГГГГ

В пост-формате строка должна быть: ГГГГ-ММ-ДД

Ограничения:

  1. Я не могу определить новый объект в моем модале. Но геттер и сеттер допускается.

Ответы [ 2 ]

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

Мне удалось создать перехватчик, который изменяет объект Date в javascript на строку.

import { HttpEvent, HttpHandler, HttpRequest } from "@angular/common/http";
import { Injectable } from '@angular/core';
import * as _ from 'lodash';
import { Observable } from "rxjs/Observable";
import { DateService } from '../../shared/services/date/date.service';

@Injectable()
export class RequestInterceptor {

  constructor(private _dateService: DateService) { }

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

    if (req.responseType !== 'json' || !req.body ||
      (req.method !== 'POST' && req.method !== 'PUT')) {
      return next.handle(req);
    }

    if (_.isArray(req.body)) {
      body = Object.assign([], req.body);
    } else {
      body = Object.assign({}, req.body);
    }

    this.changeRequest(body);
    let reqClone = req.clone({ body });
    return next.handle(reqClone);
  }

  private changeRequest(body) {
    if (body && typeof body === 'object') {
      Object.entries(body).forEach(
        ([key, value]) => {
          if (typeof value !== 'string' && _.size(value)) {
            this.changeRequest(value);
          } else if (Object.prototype.toString.call(value) === '[object Date]') {
            body[key] = this._dateService.toString(value);
          }
        }
      );
    }
  }

}

Я также создаю простой DateService, используя момент:

import { Injectable } from '@angular/core';
import * as moment from 'moment';
import 'moment/locale/en-gb';

@Injectable()
export class DateService {

  constructor() {
    moment.locale('en-gb');
  }

  toString(date: any, format: string = 'YYYY-MM-DD HH:mm:ss'): string {
    return date !== null ? moment(date).format(format) : null;
  }

}

Надеюсь, это поможет.

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

Основная идея около HttpInterceptors .

Уровень перехватчика находится между вашей логикой пользовательского интерфейса и бэкэндом. Вы можете преобразовать параметры запроса и данные ответа в нем.

Примеры:

  • пример запроса на преобразование ref
  • пример обработки ответа: ref

Теперь просто обработайте ваши данные на этом уровне.

Идеи о том, как с этим справиться:

  • рекурсивно передавайте ваш объект и изменяйте форматы даты с помощью моментов lib
  • использовать JSON.parse(JSON.stringify(<object>)) подход

вероятно, 2-й быстрее, но это, конечно, зависит от ваших особенностей.

Вы можете указать функцию замены при использовании JSON.stringify. Вы можете найти более подробные объяснения в справочнике . Таким образом, вы можете передать функцию замены и заменить ваши даты там.

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

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