ExtJS DateField спутать формат - PullRequest
4 голосов
/ 18 февраля 2012

Я использую Ext.form.DateField с указанным форматом 'd-m-Y', например:

var sellingDate = new Ext.form.DateField({
    fieldLabel : "Selling date",
    width : 180,
    name: 'sellingDate',
    format: 'd-m-Y',
    allowBlank : false
});

Я хочу, чтобы этот компонент автоматически завершил ввод значения в заданном формате после потери фокуса. Я имею в виду, что если я введу текст '040212' ( 4 февраля 2012 , в моей стране мы используем 'dd-mm-YYYY' в качестве стандартного формата даты), он должен отображать этот текст как '04 -02- 2012' .
Но при отладке при событии «изменение» DateField я вижу, что проанализированный объект Date имеет вид «Mon Apr 02 2012 ». Я не знаю, как заставить это работать, как я ожидаю выше. Есть ли способ получить необработанный текст из поля даты, а не проанализированный объект Date? Не могли бы вы помочь мне в этом?
Большое вам спасибо!

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Все просто, добавьте опцию конфигурации altFormats:

altFormats: String Несколько форматов даты, разделенных "|" попробовать когда парсинг пользовательского значения ввода, и оно не соответствует определенному формату

//So in your case, it should be 'dmy'
var sellingDate = new Ext.form.DateField({
    fieldLabel : "Selling date",
    width : 180,
    name: 'sellingDate',
    format: 'd-m-Y',
    altFormats: 'dmy',
    allowBlank : false
});
0 голосов
/ 18 февраля 2012

Похоже, что Ext анализирует любую шестизначную строку как mmddyy независимо от указанного вами формата.Это прискорбно: - /

Логика парсинга даты происходит в методе beforeBlur Ext.form.field.Date или (Ext.form.DateField в ExtJS 3).Вы можете «перехватить» этот метод и выполнить собственный массаж необработанного значения, прежде чем оно проанализирует дату:

Ext.onReady(function (){
  (function (){

    // capture the original method so we can call it later
    var originalBeforeBlur = Ext.form.field.Date.prototype.beforeBlur;

    Ext.override(Ext.form.field.Date, {
      beforeBlur: function (){
        var raw = this.getRawValue(),
            match = raw.match(/^\s*(\d{2})(\d{2})(\d{2})\s*$/);

        // rearrange the date string to match what Ext expects
        if (match){
          raw = match[2] + match[1] + match[3];
        }

        this.setRawValue(raw);
        originalBeforeBlur.call(this);
      }
    });
  })();

  var panel = new Ext.form.FormPanel({
    title: "Enter a Date",
    renderTo: Ext.getBody(),
    items: {
      xtype: "datefield",
      format: "d-m-Y"
    }
  });
});
...