如何使angularjs $ resource返回从指定域对象派生/原型化的对象数组?
以下是http://plnkr.co/edit/AVLQItPIfoLwsgDzoBdK?p=preview处理一组Note
个对象的示例。
app.controller('MainCtrl', function($scope, NoteResource) {
$scope.name = 'World';
$scope.notes = NoteResource.query();
$scope.spellCheckAllNotes = function() {
angular.forEach($scope.notes, function(note) {
note.spellCheck();
});
}
});
问题是$ resource返回Resource
的数组,而不是Note
的数组,其中Resource
方法已添加到原型中。
[解决方案应遵循“好”的JavaScript实践]
答案 0 :(得分:10)
以下是完成的 plunker 。是原始json被解析为JSON对象。它正在使用Armando提到的transformResponse
。
app.factory('NoteResource', ['$resource',
function($resource) {
var res = $resource('http://okigan.apiary.io/notes/:id', {}, {
query: {
method: 'GET',
params: {
},
isArray: true,
transformResponse: function(data, header){
//Getting string data in response
var jsonData = JSON.parse(data); //or angular.fromJson(data)
var notes = [];
angular.forEach(jsonData, function(item){
var note = new Note();
note.noteTitle = item.title;
notes.push(note);
});
return notes;
}
}
});
return res;
}
]);
为了显示标题未在原始资源中使用,我在title
和html中将noteTitle
修改为Note
。
答案 1 :(得分:1)
您可以使用资源服务定义中的 transformResponse 选项操作数据(确保将isArray设置为true):
angular.module('services', ['ngResource']).
factory("yourService", function ($resource) {
return $resource(
'/custom/url', {}, {
get: {
method: 'GET',
isArray: true,
transformResponse: function(data, headers){
//
// transform to array of objects
return data;
}
}
}
);
});