来自服务器的以下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"}]
任何提示?
答案 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 将提供包含属性0
和1
的资源。
您的选择是:
$http.get('/res').success(function(data){
$scope.test = data;
});
[{'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
希望这有助于某人...