如何在 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 的应用程序?