Передача произвольного значения в moment(value)
вызывает предупреждение об устаревании согласно # 1407.
Было бы очень хорошо, если бы был какой-то способ использовать этот синтаксический анализ, но без возврата к конструктору Date. Единственный способ, который я нашел до сих пор, довольно неуклюжий:
if (moment.isDate(value)) {
return moment(value);
} else {
return moment(value, moment.ISO_8601);
}
И даже тогда это все еще не анализирует строки ASP.net /Date(1198908717056)/
.
Самый простой вариант - разрешить строгий вариант в форме с двумя аргументами: moment(value, true)
.
Спасибо.
Чтобы уточнить, вы просите способ отключить откат, а не показывать предупреждение - без использования строгого режима, верно?
Да, я хочу автоматически анализировать все, что поддерживает moment()
, но если все они терпят неудачу, вместо вывода предупреждения и использования конструктора Date
я хочу, чтобы он выдал недопустимую дату.
Я хочу превентивно отказаться от поведения будущей версии moment
, в которой устаревший резервный вариант конструктора Date
будет полностью удален.
Я не совсем понимаю, что вы подразумеваете под строгим режимом. Вы имеете в виду при передаче точного формата, например moment(value, 'YYYY-MM-DD')
? Если да, то это не помогает, потому что 1. он слишком подробный и 2. он по-прежнему не включает все форматы, которые moment(value)
может проанализировать, прежде чем прибегнет к конструктору Date
.
Строгий режим включается путем передачи true
в качестве последнего параметра. Это в документации. По сути, это означает, что строка должна точно соответствовать формату.
Поскольку форматы, поддерживаемые непосредственно moment(String)
, перечислены в документации, я думаю, было бы приемлемо рассматривать это как строгий режим. Другими словами, добавление moment(String, Boolean)
.
Да, это было бы отлично. Спасибо.
@SystemParadox да, все, что вы хотите, поддерживается. Вы просто переопределяете moment.createFromInputFallback(config)
:
moment.createFromInputFallback = function (config) {
config._d = new Date(NaN);
}
Согласен, это нетривиально, но возможно ;-)
Это полезно, но меняет настройку глобально.
Что, если я хочу постепенно переносить кодовую базу по одному вызову за раз?
Почему мы не можем просто добавить поддержку для moment(String, true)
?
Повторное открытие, хотя есть обходной путь, наличие этого в общедоступном API поможет во многих случаях использования. Рассмотрим также # 2535, требующий проверки только для встроенных форматов.
Что нужно, так это константа moment.JS_DATE, это означает, что просто передайте ввод в new Date
, проверьте https://github.com/moment/moment/issues/1686. Прием запросов на вытягивание.
@SystemParadox, если это полезно, у меня была проблема, похожая на вашу, и я создал такие функции-оболочки, как это:
function disableNativeDateFallback(config) {
config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
return function() {
var prevFallback = moment.createFromInputFallback;
moment.createFromInputFallback = disableNativeDateFallback;
var result = momentFn.apply(null, arguments);
moment.createFromInputFallback = prevFallback;
return result;
}
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);
Они работают, заменяя createFromInputFallback
короткое время momentStrict
и momentStrict.utc
вместо moment
и moment.utc
а остальное можно оставить без изменений.
Самый полезный комментарий
@SystemParadox, если это полезно, у меня была проблема, похожая на вашу, и я создал такие функции-оболочки, как это:
Они работают, заменяя
createFromInputFallback
короткое времяmomentStrict
иmomentStrict.utc
вместоmoment
иmoment.utc
а остальное можно оставить без изменений.