一尘不染

角度资源将字符串的一维数组解析为2d

angularjs

来自服务器的以下JSON响应

[
    "hello",
    "world"
]

被此ngResource服务解析为2d数组

myService.factory('Name', function($resource){
    return $resource(site_url+'api/accounts/:accountId/names/', {}, {
        list: {method:'GET', params:{}, isArray:true}
    });
});

这样叫

$scope.names = Name.list({accountId:$scope.account.id}, function(e){
    console.log(e);
});

追踪到

[{"0":"h","1":"e","2":"l","3":"l","4":"o"},{"0":"w","1":"o","2":"r","3":"l","4":"d"}]

有什么提示吗?


阅读 184

收藏
2020-07-04

共1个答案

一尘不染

TLDR; ngResource 期望的物体或阵列 对象 中的响应。


在操作列表isArray中将设置 为时truengResource
模块遍历响应中收到的每个项目,并创建一个新的Resource实例。为此,Angular在收到的项目和Resource类之间执行了深层复制,这为我们提供了具有特殊方法的对象($save$delete依此类推)

此处检查

在内部使用 angular.copy
进行深度复制,此功能仅对 对象数组 起作用,当我们传递字符串时,它将像对待对象一样对待它。

通过提供对每个字符的顺序访问,JS中的字符串可以表现为数组。angular.copy传递字符串时将产生以下内容

angular.copy('hi',{})   => {0:'h', 1:'i'}

每个字符都将成为对象中的一个值,并将其索引设置为键。 ngResource 将提供具有属性0和的资源1


您的选择是:

使用较低级别的 $ http 服务

$http.get('/res').success(function(data){
  $scope.test = data;
});

在json响应中返回对象数组

[{'data': "hello"}, {'data': "world"}]

拦截响应并更改您的数据

如果您无法修改服务器发回的数据并想使用 ngResource
,则需要转换响应。在这里阅读操作方法

2020-07-04