0

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

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

我已将列类型和格式指定为 format:"{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>
4

2 回答 2

3

您的问题不在于格式设置。这控制如何格式化显示的值。您的问题在于价值本身。为了使格式成功,该值需要以一个Date对象开头,而现在它是一个字符串。

您可以在映射过程中使用映射对象(如此处所示)来创建Date对象:

var mapping = {
  SubmittedDate: {
    create: function(options) {
              return new Date(options.data);
    }
};
ko.mapping.fromJS(data, mapping, this);
于 2015-10-07T12:48:58.750 回答
1

根本问题是 JSON 规范没有定义 Date 数据类型。由于没有标准,各种字符串格式都被用来表示 JSON 文档中的日期。然而,剑道网格需要Date对象,而不是字符串。

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

JavaScript 的JSON.parse()函数通过接受一个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);
            }
        }
    }
});
于 2015-10-07T13:28:24.773 回答