如何在AngularJS的REST Api中处理日期字段

How to handle date fields from a REST Api in AngularJS?

本文关键字:处理 日期 字段 Api REST AngularJS      更新时间:2023-09-26

我有一个REST API,它返回带有标准ISO-8601格式日期的JSON数据:yyyy-MM-ddTHH:mm:ss:

{
    id: 4
    version: 3
    code: "ADSFASDF"
    definition: "asdflkj"
    type: "CONTAINER"
    value: "1234"
    active: "false"
    formula: false
    validTo: "2014-12-31T05:00:00"
    validFrom: "2010-12-31T10:00:00"
}

我的问题是,我不太确定如何处理这个在AngularJS。我有一个$resource GETs, post等我的API端点,但当我的数据返回时,它被存储在我的JS对象作为字符串。我认为将它作为Date()或Moment()来处理会更容易。

在Java中,我可以使用JsonDeserializer来确保所有JSON数据在分配给模型之前被正确转换,但我不知道AngularJS中是否有类似的机制。

我已经搜索过了,但似乎找不到任何实现通用解决方案的东西。我意识到我可以在我的$resource中使用transformResponse函数,但这似乎对可能包含日期的每种数据类型进行了大量重复配置。

这让我想知道以ISO-8601格式返回日期是否是最好的方法?如果AngularJS不支持它,我想一定有一种更简单的方法来处理日期。在AngularJS中如何处理日期?我应该只是把它们作为文本/字符串对象,并让API返回一个预格式化的版本吗?如果是的话,在HTML5日期输入框中最灵活的格式是什么?

JSON不支持日期,所以您需要将日期作为字符串或整数发送,并在合适的时候将它们转换为Date对象。Angular不会为你做这些,但你可以将默认的transformResponse函数定义为$httpProvider。我尝试了$resource,它确实影响了它,毕竟,$resource$http的更高层次的抽象。

如果你不知道JSON的结构,或者不想在转换函数中依赖它,你只需要将类似日期的字符串转换为Date对象。

var convertDates = function(input) {
  for(var key in input) {
    if (!input.hasOwnProperty(key)) continue;
    if (typeof input[key] === "object") {
      convertDates(input[key]);
    } else {
      if (typeof input[key] === "string" && /^'d{4}-'d{2}-'d{2}T'd{2}:'d{2}:'d{2}$/.test(input[key])) {
        input[key] = new Date(input[key]);
      }
    }
  }
}
app.config(["$httpProvider", function ($httpProvider) {
   $httpProvider.defaults.transformResponse.push(function(responseData){
     convertDates(responseData);
     return responseData;
  });
}]);

根据你的应用程序,从性能的角度来看,这可能是不明智的(例如,只有少数JSON响应包含日期或实际上需要转换日期),所以最好在那些实际需要的控制器中转换日期。