2015-10-07 94 views
0

我正在使用Kendo UI Grid的Knockout.js集成(http://rniemeyer.github.io/knockout-kendo/web/Grid.html)。Knockout-Kendo.js网格日期格式化

在我的JSON中,我返回的日期显示为Oct 06 2015, 03:54 PM -04:00

我已经指定了列的类型和格式,格式为:"{0:MM/dd/yyyy HH:mm tt}"但它似乎被完全忽略。

以下是kendogrid绑定定义:

<div data-bind="kendoGrid: { 
    data: projectSubmissions, 
    dataSource: { 
    schema: { 
     model: { 
     fields: { 
      SubmissionId: { type: 'number' } , 
      FormName: { type: 'string' } , 
      IdVersion: { type: 'string' }, 
      SubmittedDateFormatted: { type: 'string'}, 
      SubmittedDate: { type: 'date'}, 
     } 
     } 
    } 
    }, 
    groupable: false, 
    scrollable: false, 
    filterable: { 
    extra: false, 
    operators: { 
     string: { 
      startswith: 'Starts with', 
      eq: 'Is equal to', 
      neq: 'Is not equal to' 
     } 
    } 
    }, 
    sortable: true, 
    pageable: { pageSize: 10 }, 
    columns: [ 
    { 
     field: 'SubmissionId', 
     title: 'No.', 
     width: 70, 
    } 
    ,{ field: 'FormName', title: 'Form', width:120 } 
    ,{ field: 'IdVersion', title: 'Id/Version', width:100} 
    ,{ 
     field: 'SubmittedDate', 
     filterable: true, 
     title: 'Submitted Date', 
     format: '{0:MM/dd/yyyy HH:mm tt}', 
     width: 120 
    } 
    ,{ field: 'Inspector', title: 'Inspector', filterable: true, width:140 } 
    ,{ field: 'CellNo', title: 'Cell No.', width:100, filterable: false } 
    ] 
}"></div> 
+0

代码中存在拼写错误:'''{0:MM/dd/yyyy HH:mm tt}“,你在使用格式之前使用两个引号。 – Buzinas

+0

谢谢 - 我修正了(这只是粘贴示例时的错误) – David

+0

你如何解析你的json? – Amit

回答

3

你的问题是不是与format setting。这控制了如何格式化显示值。你的问题与价值本身有关。要使格式成功,该值必须是一个开头的Date对象,并且就像现在一样,它是一个字符串。

你可以使用一个映射对象(如所示here)在映射过程以创建Date对象:

var mapping = { 
    SubmittedDate: { 
    create: function(options) { 
       return new Date(options.data); 
    } 
}; 
ko.mapping.fromJS(data, mapping, this); 
+0

这解决了我的问题,谢谢您。我也有类似的问题,可筛选的UI:与knockout剑道网格datepicker以及http://stackoverflow.com/questions/32994344/knockout-kendo-js-grid-uidatepicker-filter – David

1

问题的根源在于,JSON规范定义没有日期数据类型。由于没有标准,所以使用各种字符串格式来表示JSON文档中的日期。然而,Kendo网格期望Date对象,而不是字符串。

在你的情况下,它好像是服务器发送"Oct 06 2015, 03:54 PM -04:00",这实际上是Date.parse()会接受的格式之一。

JavaScript's JSON.parse() function通过接受reviver函数,可以根据您的规则转换JSON中的任何特殊值,从而缓解标准中的这种遗漏。这通常用于“恢复”日期。

适应您输入JSON:

function reviveDates(key, val) { 
    if (key === "SubmittedDate") { 
     return new Date(val); 
    } 
    return val; 
} 

JSON.parse(yourJSON, reviveDates); 

为了使这个更方便,你可以真正融入到这一点jQuery的低级别的Ajax程序,因此你不必处理更高级别的日期转换:

$.ajaxSetup({ 
    converters: { 
     'text json': function (data) { 
      try { 
       return JSON.parse(data, reviveDates); 
      } catch (ex) { 
       $.error("Invalid JSON: " + data); 
      } 
     } 
    } 
}); 
+0

这看起来也很有趣,以及我试图添加但有些事情并不完全正确。在上面的示例中,什么是reviveDates ...在那里有些不正确? thx – David

+0

@David'reviveDates'是我在我的第一个代码示例中定义的函数。 – Tomalak

+0

哦,我的坏..绝对..谢谢 – David