使angularjs $ resource返回[OO]对象的数组

时间:2014-05-07 16:30:47

标签: angularjs angular-resource

如何使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实践]

2 个答案:

答案 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;
                }
            }
        }
    );
});