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

Posted

技术标签:

【中文标题】如何在 AngularJS 中处理来自 REST Api 的日期字段?【英文标题】:How to handle date fields from a REST Api in AngularJS? 【发布时间】:2014-10-14 12:10:14 【问题描述】:

我有一个 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,其中 GET、POST 等我的 API 端点,但是当我的数据返回时,它作为字符串存储在我的 JS 对象中。我认为作为 Date() 或 Moment() 处理会更容易。

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

我四处搜索,但似乎找不到任何实现通用解决方案的东西。我意识到我可以在我的$resource 中使用transformResponse 函数,但是对于可能包含日期的每种数据类型,这似乎是很多重复配置。

这让我想知道以 ISO-8601 格式返回日期是否是最好的方法?如果 AngularJS 不支持开箱即用,我认为必须有一种更简单的方法来处理日期。如何处理 AngularJS 中的日期?我是否应该将它们视为文本/字符串对象,并让 API 返回预格式化的版本?如果是这样,在 html5 日期输入框等中使用的最灵活的格式是什么?

【问题讨论】:

使用moment js在客户端momentjs.com/docs上格式化你的日期。通常,您从服务器返回的日期视为它在客户端上到达的字符串。您必须使用自定义 js 代码或类似 moment 的库自己格式化它。另外,我认为您不需要在 app.config 中执行此操作。只需从服务器获取数据并格式化日期属性,或者您可以使用 Angular 过滤器格式化日期docs.angularjs.org/api/ng/filter/date。 【参考方案1】:

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" && /^\d4-\d2-\d2T\d2:\d2:\d2$/.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 响应包含日期或实际上需要转换日期),因此最好在实际需要的那些控制器中转换日期.

【讨论】:

引用最后一条评论,我习惯于在我需要的工厂中转换日期,这样您就可以避免控制器中的这种转换逻辑。

以上是关于如何在 AngularJS 中处理来自 REST Api 的日期字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AngularJS 和 Restangular 返回/编辑 REST 资源

如何使用 AngularJS 和 Restangular 返回/编辑 REST 资源

如何验证与服务器的连接来自具有 Ionic/AngularJS/Cordova 的应用程序?

如何在 React 中使用 fetch 正确处理来自 REST API 的数据对象

如何在angularjs中调用rest API

Rest API 生成 PDF byte[] JSON 内容类型,使用 angularJS 在 Web 中查看