Angular Material datepicker + moment, сериализация объектов момента для бэкэнда?

У меня есть средство выбора даты, использующее адаптер момента с локалью, с датами все в порядке, но я не могу преобразовать их на бэкэнде. Я получаю это из формы, используя formGroup.value

Перед отправкой на серверную часть (через angular firebase) это выглядит так:

from: Moment
_d: Sat Jul 06 2019 01:00:00 GMT+0100 (British Summer Time) {}
_i: {year: 2019, month: 6, date: 6}
_isAMomentObject: true
_isUTC: true
_isValid: true
_locale: Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: "Invalid date", ordinal: ƒ, _dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, …}
_offset: 0
_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -1, charsLeftOver: 0, …}
__proto__: Object

Но на бэкэнде это выглядит так:

from:
>        { _isAMomentObject: true,
>          _i: [Object],
>          _isUTC: true,
>          _pf: [Object],
>          _locale: [Object],
>          _d: {},
>          _isValid: true,
>          _offset: 0 },

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

Я отправляю его через @angular/fire как функцию httpCallable.

РЕДАКТИРОВАТЬ: текущий обходной путь, который довольно хакерский/непредпочтительный:

    let oldFrom: moment.Moment = this.from.value;
    let oldTo: moment.Moment = this.to.value;
    this.ReportForm.controls.from.setValue(oldFrom.toISOString());
    this.ReportForm.controls.to.setValue(oldTo.toISOString());
    this.submitted.emit(this.ReportForm.value);
    this.ReportForm.controls.from.setValue(oldFrom);
    this.ReportForm.controls.to.setValue(oldTo);

Мне нужно изменить его обратно на объект момента, иначе они перестанут работать для всех будущих дат.


person SebastianG    schedule 10.07.2019    source источник


Ответы (1)


Вы можете использовать format перед отправкой на серверную часть.

momentDate.format('YYYY-MM-DD')

Что я обычно делаю, так это

momentDate.utc().toISOString()
person Icycool    schedule 10.07.2019
comment
Я думал об этом, но проблема в том, что моя форма может использоваться повторно, и некоторые элементы управления могут быть/не быть в группе форм. Если мне придется перестроить весь объект с нуля, мне придется добавить логику вокруг его гибкости и взломать его, мне было интересно, возможно ли что-то еще в первую очередь - person SebastianG; 10.07.2019
comment
@MichaelB Для меня форма находится в компоненте, а форматирование выполняется в сервисе перед отправкой http или внутри конструктора модели. Если вы действительно хотите получить строку в качестве значения формы, вы также можете написать свой собственный адаптер. - person Icycool; 10.07.2019