例如在dojo dijit / form / DateTextBox中



<link href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.3/dojo/resources/dojo.css" rel="stylesheet" />
<link href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.3/dijit/themes/claro/claro.css" rel="stylesheet" />
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.9.3/dojo/dojo.js" djConfig="parseOnLoad:true"></script>

<body class="claro">
  <input type="text" name="testDate" data-dojo-id="testDate" class="dateTextBox" value="" data-dojo-type="dijit/form/DateTextBox" id="scheduledDate" data-dojo-props="constraints:{datePattern: 'MM/dd/yyyy|MMddyyyy'}">





大家都可以看到,我正在尝试使用两种日期格式。但这适用于第一种格式,在这种情况下为MM / dd / yyyy。但是MMddyyyy无法正常工作。

请帮我解决这个问题。

最佳答案

我认为小部件本身不可能做到这一点。原因是datePattern用于输入和输出。因为只能显示一个输出,所以只能有一个模式。如果我运行您的示例并从下拉列表中选择一个数据,那么对于日期2012年12月8日,输出为12/08/2012 | 12082012。它在屏幕后的作用是使用模式直接使用不支持正则表达式的模块(这只是一个简单的日期模式)。

但是,并非完全不可能实现,您可以扩展dojo/date/locale并使它起作用,以便有不同的输入和输出模式。查看dijit/form/DateTextBox的代码。在第77行,您可以看到diji/form/_DateTimeTextBox方法,该方法实际上将输入字符串转换为日期。您将不得不覆盖此功能。

覆盖小部件的示例是通过执行以下操作:

declare("custom/DateTextBox", [DateTextBox], {
    parse: function(value, constraints) {
        var out = null;
        if (constraints.inputDatePattern !== undefined) {
            var patterns = constraints.inputDatePattern.split('|');
            for (var idx = 0; idx < patterns.length && out === null; idx++) {
                out = this.dateLocaleModule.parse(value, lang.mixin(constraints, {
                    datePattern: patterns[idx]
                }));
            }
        } else {
            out = this.inherited(arguments);
        }
        return out || (this._isEmpty(out) ? null : undefined);
    }
});


我在这里实际要做的是引入一个称为parse的新约束,该约束用于解析输入(而inputDatePattern将用于输出)。如果未定义datePattern,我将使用原始函数来解析输入。如果已定义,则用管道符号(inputDatePattern)拆分模式,并尝试每个模式,直到获得正确的值。

所有这些共同导致一个自定义的datetextbox。您还必须更改HTML,直到您输入this之类的内容。

09-25 18:29