Предупреждение об устаревании: построение moment возвращается к дате js Это не рекомендуется и будет удалено в предстоящем крупном выпуске

#momentjs #ionic2

#momentjs #ionic2

Вопрос:

Я использую Moments , но получаю предупреждение об амортизации. Может кто-нибудь посоветовать, где мой код вызывает это, и что он должен изменить, чтобы угодить?

http://momentjs.com/guides/#/warnings/js-date/

 Deprecation warning: moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.
Arguments: [object Object]
Error
    at Function.<anonymous> (file:///android_asset/www/build/js/app.bundle.js:101533:106)
    at configFromString (file:///android_asset/www/build/js/app.bundle.js:103263:33)
    at configFromInput (file:///android_asset/www/build/js/app.bundle.js:103623:14)
    at prepareConfig (file:///android_asset/www/build/js/app.bundle.js:103606:14)
    at createFromConfig (file:///android_asset/www/build/js/app.bundle.js:103573:45)
    at createLocalOrUTC (file:///android_asset/www/build/js/app.bundle.js:103660:17)
    at local__createLocal (file:///android_asset/www/build/js/app.bundle.js:103664:17)
    at utils_hooks__hooks (file:///android_asset/www/build/js/app.bundle.js:101264:30)
    at DateFormatPipe.transform (file:///android_asset/www/build/js/app.bundle.js:115304:17)
    at DebugAppView._View_MessagesPage3.detectChangesInternal (MessagesPage.template.js:795:88)
    at DebugAppView.AppView.detectChanges (file:///android_asset/www/build/js/app.bundle.js:16171:15) 
  

messages.html

 <center><span class="message-datetime">{{message.createdAt | amDateFormat: 'DD MMM YYYY'}}</span></center>
<span class="message-timestamp">{{message.createdAt | amDateFormat: 'h:mm a'}}</span>
  

messages.ts

 import {DateFormatPipe} from 'angular2-moment';

@Component({
  templateUrl: 'build/pages/messages/messages.html',
  pipes: [DateFormatPipe]
})
  

models.d.ts

   interface Message {
    _id?: string;
    chatId?: string;
    senderId?: string;
    ownership?: string;
    content?: string;
    createdAt?: Date;
    changeDate?: boolean;
    readByReceiver?: boolean;
    lastMessageComp?: Tracker.Computation;
  }
  

Ответ №1:

Похоже, что свойство «createdAt» содержит строку, а не дату. Извлекается ли объект с сервера? если это так, скорее всего, у вас есть дата, отформатированная в текст (что-то вроде «2012-04-21T18:25:43» или «» / Date(1335205592410)/»»).

Пожалуйста, помните, что с помощью typescript вы можете указывать типы переменных, проверка типов выполняется во время «компиляции», но это не гарантирует, что содержимое является датой, когда браузер выполняет переданный ts (а также вы можете применить канал к строковому свойству без каких-либо изменений).ошибки «время компиляции»).

Если объект представляет собой json, десериализованный из http, что вы можете сделать, это вручную проанализировать дату:

 return this.http.get('api/Some/Url/Messages', { search: params })
        .map((res: Response) => {
            let messages = res.json();

            return _.map(messages, (t: Message) => {
                return {
                    chatId: t.chatId,
                    senderId: t.senderId,
                    ...: ...,
                    createdAt: moment(t.createdAt, 'YYYYMMDD').toDate(),
                    ...: ...
                };
            });
        })
        .catch(this.handleError);
  

Комментарии:

1. Спасибо за ответ. Но я не думаю, что это ответ, потому createdAt что всегда просто берется из MongoDB и определяется как: createdAt?: Date; , Я никогда не манипулирую датой, кроме как при добавлении ее в MongoDB, с new Date() помощью .

2. ps. Я постараюсь добавить его в MongoDB следующим образом: moment(new Date())

3. Не могу добавить a Moment к a Date : error TS2345: Argument of type '{ memberIds: string[]; lastMessageCreatedAt: Moment; read: boolean; }' is not assignable to parameter of type 'Chat'. я думаю, что мне нужно скорее извлечь его таким образом.

4. Хорошо, это происходит из MongoDB, но для отображения браузером данные будут сериализованы в json и десериализованы в js object при использовании http (или вы используете angular universal или что-то еще?) Когда происходит эта сериализация / десериализация, дата является строкой, потому что JSON изначально не поддерживает date . Пожалуйста, попробуйте использовать плагин Augury chrome, чтобы понять тип вашего значения createdAt