ExtJS DateField混淆了格式

ExtJS DateField confuse format

本文关键字:格式 DateField ExtJS      更新时间:2023-09-26

我使用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"(2012年2月4日,在我的国家,我们使用"dd-mm-YYYY"作为标准日期格式),它必须将该文本显示为"04-02-2012"
但当在DateField的事件"change"处调试时,我看到解析的Date对象是"MonApr 02 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
});

无论您指定的格式如何,Ext都会将任何六位字符串解析为mmddyy。这很不幸:-/

用于解析日期的逻辑出现在Ext.form.field.Date或(ExtJS 3中的Ext.form.DateField)的beforeBlur方法中。您可以"拦截"该方法,并在解析日期之前对原始值进行自己的按摩:

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"
    }
  });
});