easyUI的datagrid控件日期列不能正確顯示Json格式數據的解決方案

EasyUI是一套比較輕巧易用的Jquery控件,在使用過程當中遇到一個問題,它的列表控件——datagrid, 在顯示日期列的時候,因爲後臺返回給頁面的數據是Json格式的,其中的日期字段,在後臺是正常的「2012-11-10 12:18:00」這樣的格式,json序列化後返回到前臺頁面就被轉換成一個像 /Date(1419264000000)/的格式,致使easyUI沒法解析這個字段。通過一番研究,下面給出兩種解決方式 但願能幫到你們!javascript

 

第一種:比較簡單java

定義函數:
function formatterdate(val, row) {
                  var date = new Date(val);
                  return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
 }
而後在datagrid中添加:
  formatter:formatterdate

函數能夠根據本身的須要修改格式。json

 

 

第二種解決辦法:app

 

完整Demo文件:dateboxFormat-demo函數

 

(如下全部代碼都是前臺頁面的JS代碼)this

1.定義方法使日期列的顯示符合閱讀習慣:spa

 

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. function formatDatebox(value) {  
  2.     if (value == null || value == '') {  
  3.         return '';  
  4.     }  
  5.     var dt = parseToDate(value);//關鍵代碼,將那個長字符串的日期值轉換成正常的JS日期格式  
  6.     return dt.format("yyyy-MM-dd"); //這裏用到一個javascript的Date類型的拓展方法,這個是本身添加的拓展方法,在後面的步驟3定義  
  7. }  
  8.   
  9. /*帶時間*/  
  10. function formatDateBoxFull(value) {  
  11.     if (value == null || value == '') {  
  12.         return '';  
  13.     }  
  14.     var dt = parseToDate(value);  
  15.     return dt.format("yyyy-MM-dd hh:mm:ss");  
  16. }  

 

2.上面用到的日期處理方法.net

 

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. function parseToDate(value) {  
  2.     if (value == null || value == '') {  
  3.         return undefined;   
  4.     }  
  5.   
  6.     var dt;  
  7.     if (value instanceof Date) {  
  8.         dt = value;  
  9.     }  
  10.     else {  
  11.         if (!isNaN(value)) {  
  12.             dt = new Date(value);  
  13.         }  
  14.         else if (value.indexOf('/Date') > -1) {  
  15.             value = value.replace(/\/Date(?\d+)\//, '$1');  
  16.             dt = new Date();  
  17.             dt.setTime(value);  
  18.         } else if (value.indexOf('/') > -1) {  
  19.             dt = new Date(Date.parse(value.replace(/-/g, '/')));  
  20.         } else {  
  21.             dt = new Date(value);  
  22.         }  
  23.     }  
  24.     return dt;  
  25. }  
  26.   
  27. //爲Date類型拓展一個format方法,用於格式化日期  
  28. Date.prototype.format = function (format) //author: meizz   
  29. {  
  30.     var o = {  
  31.         "M+": this.getMonth() + 1, //month   
  32.         "d+": this.getDate(),    //day   
  33.         "h+": this.getHours(),   //hour   
  34.         "m+": this.getMinutes(), //minute   
  35.         "s+": this.getSeconds(), //second   
  36.         "q+": Math.floor((this.getMonth() + 3) / 3),  //quarter   
  37.         "S": this.getMilliseconds() //millisecond   
  38.     };  
  39.     if (/(y+)/.test(format))  
  40.         format = format.replace(RegExp.$1,  
  41.                 (this.getFullYear() + "").substr(4 - RegExp.$1.length));  
  42.     for (var k in o)  
  43.         if (new RegExp("(" + k + ")").test(format))  
  44.             format = format.replace(RegExp.$1,  
  45.                     RegExp.$1.length == 1 ? o[k] :  
  46.                         ("00" + o[k]).substr(("" + o[k]).length));  
  47.     return format;  
  48. };  

 

 

3.步驟1定義的方法讓控件在閱讀狀態下的顯示獲得糾正,但dataGrid控件還有行編輯狀態,行編輯狀態下仍是會出現日期不能正常顯示的情況,prototype

 

此時須要拓展datagrid方法(這裏說成重寫比較貼切),使datagrid行編輯時,日期控件內的時間格式正確顯示:code

 

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. $.extend(  
  2.     $.fn.datagrid.defaults.editors, {  
  3.         datebox: {  
  4.             init: function (container, options) {  
  5.                 var input = $('<input type="text">').appendTo(container);  
  6.                 input.datebox(options);  
  7.                 return input;  
  8.             },  
  9.             destroy: function (target) {  
  10.                 $(target).datebox('destroy');  
  11.             },  
  12.             getValue: function (target) {  
  13.                 return $(target).datebox('getValue');  
  14.             },  
  15.             setValue: function (target, value) {  
  16.                 $(target).datebox('setValue', formatDatebox(value));  
  17.             },  
  18.             resize: function (target, width) {  
  19.                 $(target).datebox('resize', width);  
  20.             }  
  21.         },  
  22.         datetimebox:{  
  23.             init: function (container, options) {  
  24.                 var input = $('<input type="text">').appendTo(container);  
  25.                 input.datetimebox(options);  
  26.                 return input;  
  27.             },  
  28.             destroy: function (target) {  
  29.                 $(target).datetimebox('destroy');  
  30.             },  
  31.             getValue: function (target) {  
  32.                 return $(target).datetimebox('getValue');  
  33.             },  
  34.             setValue: function (target, value) {  
  35.                 $(target).datetimebox('setValue', formatDateBoxFull(value));  
  36.             },  
  37.             resize: function (target, width) {  
  38.                 $(target).datetimebox('resize', width);  
  39.             }  
  40.         }  
  41.     });  

 4.前面的準備工做作好後,接下來就是將前面寫的 formatDatebox 方法應用到控件 ,datagrid控件的列屬性裏面有一個formatter成員,用來自定義列的顯示方法。把步驟1中定義的那個 formatDatebox或formatDateboxFull方法名關聯到這個成員就能夠了。

 

(這裏只截取部分代碼,相信正在用這個控件的朋友一看就明白了) 

[javascript]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. $('#dg').datagrid({  
  2.   
  3.    columns: [[  
  4.   
  5.          { field: 'StartDate', title: '開工日期', width: 80, formatter:formatDatebox, editor: 'datebox' },  
  6.          { field: 'CompletedDate', title: '竣工日期', width: 80, formatter:formatDateboxFull, editor: 'datetimebox' },  

 

你能夠把前面三個步驟的代碼拷貝到一個JS文件裏面,在頁面進行關聯,而後頁面應用一下其中的formatDatebox方法。

 

完整Demo文件:dateboxFormat-demo

相關文章
相關標籤/搜索