使用dojo.formToJson

时间:2016-01-28 08:20:07

标签: javascript date dojo

我通过提供属性

更改了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'

但是当我尝试使用dijit/form/DateTextBox获取包含dojo.formToJson("formID")的表单的JSON时,我得到的值与指定的模式不同:'2016-01-28'

为什么呢?对此有什么解决方案吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题在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对象或反向(Object to String)

然后声明formatJsonFormDates函数 (params在代码中解释它返回一个带有格式化日期的新jsonForm)

  如果表单中有很多日期,

可以帮助您转换所有日期   在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);
}

finnaly,在获得你的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");