【问题标题】:Knockout-Kendo.js Grid date formattingKnockout-Kendo.js 网格日期格式
【发布时间】:2015-10-07 12:06:13
【问题描述】:

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

在我的 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:MM/dd/yyyy HH:mm tt}',您在使用格式之前使用了两个引号。
  • 谢谢 - 我已修复(这只是粘贴样本时的错误)
  • 你如何解析你的json?
  • 我正在使用 ko.mapping.fromJS(data, {}, this);来执行映射。结果属性看起来像 "SubmittedDate": "2015-10-06T15:54:02.047",
  • 我也无法让过滤器 UI:datepicker 工作,我希望这些问题能够得到解决

标签: knockout.js kendo-grid knockout-kendo


【解决方案1】:

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

您可以在映射过程中使用映射对象(如图here)创建Date 对象:

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

【讨论】:

【解决方案2】:

根本问题是 JSON 规范没有定义 Date 数据类型。由于没有标准,各种字符串格式都被用来表示 JSON 文档中的日期。然而,Kendo Grid 需要 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);
            }
        }
    }
});

【讨论】:

  • 这看起来也很有趣,我尝试添加,但有些地方不太对劲。在上面的示例中,什么是 reviveDates ...有什么不正确的地方吗?谢谢
  • @David reviveDates 是我在第一个代码示例中定义的函数。
  • 使用这种方法的好处是它位于 jQuery 核心中,您收到的任何和所有日期都会自动转换它们的日期。在淘汰赛中,您将永远不必再关心。就好像服务器会发送实际日期一样。当然,您也可以使用它来预处理您收到的任何其他 JSON 数据。
  • 它处于核心级别,这很好,但是您仍然为通过 json 返回的每组数据指定一个函数 ..即reviveDates 函数。我最初认为它适用于所有日期很棒,它会神奇地找出哪些字段是日期,但不幸的是,对于每个 json 请求,我必须有一个函数来解析这些日期字段。有没有办法使任何日期字段的恢复通用?
  • @David 改一下函数就好了。我的示例函数使用if (key === "SubmittedDate") 检查。您需要做的就是使该检查更通用,以便它适用于您收到的所有日期字段。您不需要为每个 JSON 请求创建一个特殊的函数。此解决方案旨在在页面加载时准确执行一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2019-07-11
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多