使用dojo.formToJson时获得不同的日期模式

anhgbhbe  于 2022-12-16  发布在  Dojo
关注(0)|答案(2)|浏览(206)

我通过提供一个属性更改了dijit/form/DateTextBox的datePattern

<form dojoType="dijit.form.Form" data-dojo-id="calc_form" id="calc_form">

    <input type="text" data-dojo-type="dijit/form/DateTextBox" data-dojo-id="CONTRACT_DATE"
           id="CONTRACT_DATE" name="CONTRACT_DATE" 
           constraints="{datePattern:'MM-dd-yyyy', strict:true}" />
</form>

即属性是constraints="{datePattern:'MM-dd-yyyy', strict:true}",我得到的日期模式在页面中正确显示为'01-28-2016'
但是当我尝试使用dojo.formToJson("formID")获取包含dijit/form/DateTextBox的表单的JSON时,我得到了一个与指定模式不同的值:'2016-01-28'
为什么?有什么解决办法吗?

rekjcdws

rekjcdws1#

datePattern的唯一用途是格式化用户在DateTextBox中键入日期的方式。
无论用户以什么格式输入日期,Dojo内部都能在ISO date format * 中工作,这也使您(程序员)更容易。
如果您正在考虑将ISO转换为另一种专有格式,有一个模块可以实现这一点。

require(['dojo/date/locale'], function(locale) {
    var date = locale.parse('2016-01-28', {
        datePattern: 'yyyy-MM-dd',
        selector: 'date'
    });
    var formattedDate = locale.format(date, {
        datePattern: 'MM-dd-yyyy',
        selector: 'date'
    });
    console.log(formattedDate);
});
rpppsulh

rpppsulh2#

问题是在dojo.formToJson中,无论您在dijit/form/DateTextBox输入中指定什么格式,它都会返回默认的日期格式。
因此,我建议在生成的jsonForm中格式化日期,
下面是一个解决方案:
首先导入所需的js,

//AMD loading
require(["dojo/date/locale","dojo/json"],
function(locale,JSON){
    ......
})

"dojo/date/locale"用于更改日期模式
"dojo/json"用于解析o json对象或反向解析(对象到字符串)
然后声明formatJsonFormDates函数(参数在代码中解释,它返回一个带有格式化日期的新jsonForm)
如果Form中有许多日期,则可通过在Array参数中传递输入日期的name属性来帮助您将所有日期转换为一个

//helper function
/**
 * The function get  generated 'form' from dojo.formToJson(HTML from),
 * and replaces all string Date to the desired format 
 * ("YYYY-MM-dd" to "MM-dd-YYYY" by exemple)
 *
 * @param string jsonForm Value of generated jsonForm(HTML from)
 * @param Object form Value of the Dijit.form.Form
 * @param Array dateFieldsNames string array Values of date form fields to be formatted
 * @param string datepattern Values of the wanted Dateformat // "mm-dd-YYYY"
 *
 * @return string jsonFormObject Value of new Returned jsonForm with desired date format
 */

var formatJsonFormDates  = function(jsonForm,form,dateFieldsNames,datepattern){
    //if no field passed to the function return default
    if(!fieldsNames.length && fieldsNames.length < 1 ) return jsonForm;

    jsonFormObject = JSON.parse(jsonForm);
    for(var i = 0; i<fieldsNames.length ;i++){
        //check if field is an instance of Date
        if(form.getValues()[fieldsNames[i]] instanceof Date) {
            newDate = locale.format(form.getValues()[fieldsNames[i]],{datePattern: datepattern, selector: "date"});
            jsonFormObject[fieldsNames[i]] = newDate;
        }
    }
    return JSON.stringify(jsonFormObject);
}

最后,在获得jsonForm之后,在其上应用函数:

var formData = dojo.formToJson("yourFormID");
//I recomoand  to use dijit/registry  instead of dijit 

formData = formatJsonFormDates(formData,dijit.byId("yourFormID"),["CONTRACT_DATE"],"MM-dd-yyyy");

相关问题