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

ric*_*ick 62 json angularjs

来自服务器的以下JSON响应

[
    "hello",
    "world"
]
Run Code Online (Sandbox Code Playgroud)

正在通过此ngResource服务将其解析为2d数组

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

这样叫

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

追踪到

[{"0":"h","1":"e","2":"l","3":"l","4":"o"},{"0":"w","1":"o","2":"r","3":"l","4":"d"}]
Run Code Online (Sandbox Code Playgroud)

任何提示?

jai*_*ime 99

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


当在操作列表中isArray设置为时true,ngResource模块迭代响应中接收的每个项目,并创建资源的新实例.要做到这一点角度,基于接收到的项目和之间的深拷贝Resource类,这让我们有特殊的方法的对象($save,$delete等等)

这里检查来源.

内部角度使用angular.copy来执行深度复制,此函数仅对对象数组进行操作,当我们传递字符串时,它会将其视为对象.

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

angular.copy('hi',{})   => {0:'h', 1:'i'}
Run Code Online (Sandbox Code Playgroud)

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


你的选择是:

使用较低级别的$ http服务

$http.get('/res').success(function(data){
  $scope.test = data;
});
Run Code Online (Sandbox Code Playgroud)

返回json响应中的对象数组

[{'data': "hello"}, {'data': "world"}] 
Run Code Online (Sandbox Code Playgroud)

拦截响应并更改您的数据

如果您无法修改服务器发回的数据并希望使用ngResource,则需要转换响应.在这里阅读如何做到这一点

  • 谢谢 - 如果我之前只遇到这个:) (3认同)
  • 谢谢,我花了12个小时搜索解决方案.谢谢你,我不会花25个小时:).我正在返回一个对象并且isArray被设置为false,但是我仍然遇到了同样的问题.我仍然使用资源修复它,并按照您的建议将其放在服务器端的列表中. (3认同)