Неправильная дата синтаксического анализа ExtJS - PullRequest
2 голосов
/ 15 марта 2012

Когда я вписываю «31/12/2012» в моем поле (формат даты - ММ / ДД / ГГГГ), в поле даты изменяется на «7/12/2014». Я бы предпочел ошибку с «недействительным» сообщением об ошибке.

Я унаследовал этот код от предыдущего разработчика:

function dateRangeCheck(val, field) {
    field.vtypeText = '';

    var date = field.parseDate(val);
    if (!date) {
        field.vtypeText = val + ' is not a valid date - it must be in the format (MM/DD/YYYY).';
        return false;
    }

    var retVal = true;

    if (field.fromField) {
        var fromField = Ext.getCmp(field.fromField);
        var fromDate = fromField.parseDate(fromField.getValue());
        // If we don't have a fromDate to validate with then return true
        if (!fromDate)
            return true;

        retVal = (date >= fromDate);

        if (retVal)
            fromField.clearInvalid();
    }
    else if (field.toField) {
        var toField = Ext.getCmp(field.toField);
        var toDate = toField.parseDate(toField.getValue());
        // If we don't have a toDate to validate with then return true
        if (!toDate)
            return true;

        retVal = (date <= toDate);

        if (retVal)
            toField.clearInvalid();
    }

    if (!retVal) {
        field.vtypeText = 'From Date must be less than or equal to To Date.';
    }
    return retVal;
}

Когда я пытаюсь использовать vtype типа 'daterange' по умолчанию, как только я набираю «3» в поле, он генерирует исключительную ситуацию времени выполнения JS «объект не поддерживает это свойство или метод».

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Обратите внимание, что вы можете установить Date.useStrict = true глобально, и DateField будет использовать его по умолчанию.

enter image description here

Для Ext 4+ вместо этого будет Ext.Date.useStrict = true.

1 голос
/ 16 марта 2012

Похоже, что ваш звонок на parseDate просто должен иметь строгий переключатель .

strict (необязательно) True для проверки строк даты во время синтаксического анализа (т.е. предотвращает javascript Date ("rollover") (по умолчанию false). Недействительная дата строки будут возвращать ноль при разборе.

> Date.parseDate('31/12/2012','m/d/Y')
  Sat Jul 12 2014 00:00:00 GMT-0500 (Central Daylight Time)
> Date.parseDate('31/12/2012','m/d/Y', true)
  null

Метод parseDate в DateField является закрытым и недокументированным, а обсуждение , разрешающее строгий анализ даты в ExtJS 3.x, никогда не принесло никаких результатов. Я думаю, что вам лучше всего использовать переопределение, чтобы разрешить строгий анализ даты.

// before you use your DateFields
Ext.override(Ext.form.DateField, {
    safeParse : function(value, format) {
        if (Date.formatContainsHourInfo(format)) {
            // if parse format contains hour information, no DST adjustment is necessary
            return Date.parseDate(value, format, this.strict);
        } else {
            // set time to 12 noon, then clear the time
            var parsedDate = Date.parseDate(value + ' ' + this.initTime, format + ' ' + this.initTimeFormat, this.strict);

            if (parsedDate) {
                return parsedDate.clearTime();
            }
        }
    }
});

//... and in your DateField config:  
strict: true,
...