【发布时间】:2016-06-06 02:01:30
【问题描述】:
我正在使用的后端团队实现了一个 REST API,它将集合作为对象(而不是数组)返回。
例如,调用 GET /some_resources 将返回:
{
id_1: {
p1: "lorem",
p2: 4
},
id_2: {
p1: "ipsum",
p2: 2
},
id_n: {
p1: "sic",
p2: 7
}
}
此结构仅限于在 Angular 中使用,因为您无法利用 ng-repeat 指令(例如 orderBy and filter do not work with object)。
对于前面的示例,理想情况下,我宁愿期待一个对象数组:
[
{id: "id_1", p1: "lorem", p2: 4},
{id: "id_2", p1: "ipsum", p2: 2},
{id: "id_n", p1: "sic", p2: 7}
]
这将允许直接使用 ngResource 服务返回的对象并将其发送回去,而无需触及其结构。它还允许充分使用 ng-repeat 指令。
当我要求后端团队将他们的集合响应结构从对象更改为数组时,他们认为 API 使用者不应主导响应结构的设计。
我部分同意他们的论点,所以目前,我找到的唯一解决方案是将对象转换为数组,将此对象处理到我的范围内,然后将数组重新转换回原始对象结构,然后再将其发送回到 API。
这导致了很多代码样板,我想知道是否有一种“角度方式”来处理这种情况。
【问题讨论】:
-
如果您使用 ngResource,您可以设置请求和响应转换器以透明地处理数据操作
-
好的,我明白了。但是我必须为每种情况实施变压器,对吗?我的意思是,没有通用的方法吗?不过,Transformers 很有趣,因为它们减少了我的控制器中的代码量,这些控制器目前正在执行转换。
-
如果您所做的只是转换为数组并将对象键添加为
id,则可以重复使用转换器 -
是的,除了在某些情况下,有几个嵌套级别,例如 { id_1: { nested_collection: { key_1: "...", key_2: "..." }, id_2: { key_1:“...”,key_2:“...”}}。在其他情况下,它就像我的问题中的示例一样简单。不过我重用了一些通用代码。