62

来自服务器的以下 JSON 响应

[
    "hello",
    "world"
]

此 ngResource 服务正在将其解析为二维数组

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"}]

有什么提示吗?

4

2 回答 2

99

TLDR;ngResource在您的响应中需要一个对象或对象数组。


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

在此处查看来源

内部 angular 使用angular.copy来执行深拷贝,这个函数只对对象数组进行操作,当我们传递一个字符串时,它将把它当作一个对象。

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

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

每个字符都成为对象中的一个值,其索引设置为键。ngResource将提供具有属性01.


您的选择是:

使用较低级别的$http服务

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

在您的 json 响应中返回一个对象数组

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

拦截响应并更改您的数据

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

于 2012-12-11T08:04:11.870 回答
-1

我也一直在为此苦苦挣扎。这是我通过使用查询稍微调整服务的解决方案

var app = angular.module('testApp', ['ngResource']);

app.factory('Name', function($resource, $sce) {
  var path = "test.json";

  return $resource(path, {}, {
    query: {
      method: 'GET',
      isArray: false
    }
  })
});

app.controller('testController', function($scope, Name) {
  $scope.result;

  $scope.getResult = function() {
    Name.query(function(data) {
      $scope.result = data;
    });
  };

  $scope.getResult();
});

HTML:

<!DOCTYPE html>
<html ng-app="testApp">

<head>

  <link href="style.css" rel="stylesheet" />
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-resource.min.js"></script>

  <script src="script.js"></script>
</head>

<body ng-controller="testController">
  <h1>{{result.surname}}</h1>

</body>

</html>

和 JSON 文件:

{
    "name": "Homer",
    "surname":  "Simpson",
    "Town": "Springfield"
}

如果有兴趣,也可以使用 Plunker:http: //plnkr.co/edit/SwqlZyqZ4zfcpaLxaf39

希望这可以帮助某人...

于 2015-04-16T12:55:45.180 回答