例如在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之类的内容。