Moment: Значение синтаксического анализа без отката

Созданный на 10 июл. 2015  ·  9Комментарии  ·  Источник: moment/moment

Передача произвольного значения в 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) .

Спасибо.

Enhancement

Самый полезный комментарий

@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 а остальное можно оставить без изменений.

Все 9 Комментарий

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

Да, я хочу автоматически анализировать все, что поддерживает 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 а остальное можно оставить без изменений.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги