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

时间:2012-12-11 04:30:17

标签: json 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"}]

任何提示?

2 个答案:

答案 0 :(得分:99)

TLDR; ngResource 需要您的回复中包含 对象 的对象或数组。


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

检查source here

内部角度使用 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 ,则需要转换响应。阅读如何操作here

答案 1 :(得分:-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

希望这有助于某人...