0

使用 resource.get() 我得到这个错误:

“资源配置错误。预期响应包含一个对象但得到一个数组”。

如果我将资源配置为期望一个数组,我会得到这个:

“资源配置错误。预期响应包含一个数组但得到一个对象”

如果我转储 Advanced Rest Client 的响应,我将返回以下内容:

{
    "Note": {
        "id": "1",
        "clas": "test",
        "obj_id": null,
        "note": "test"
    }
}

这对我来说就像一个对象。奇怪的是该页面仍然可以正常工作。但是我在控制台中得到了那个错误。

工厂:

angular.module('app').factory('Notes', function($resource) {
    var notes = $resource('/index.php/notes/:id.json');
    return {
        get: function(id, success) { notes.get({id:id}, function(resp) { success(resp.Note); }); },
        query: function() { return notes.query(); }
    }
});

控制器

angular.module('app').controller('NotesCtrl',
    function($scope, $stateParams, $state, $location, Notes) {
        Notes.get($stateParams.id,
            function(note) {
                $scope.note = note;
            },
            function(note) {
                console.log('error');
                console.log(note);
            }
        );
    });

该资源是使用 CakePHP 构建的,这是 bake 为您制作的正在序列化的 vanilla 视图函数。

4

2 回答 2

0

我想只是让其他有类似情况的人都知道有一个解决方案(或者至少是一个解决方案),我会在这里做一个正式的回答。看到 php 本身不说 json,它可以生成 angular 无法解析的有问题的 json。为了确保问题不是(或者是)json,绕过 php 并欺骗 json。

要欺骗 api,请创建一个新控制器并将预期的 json 插入范围。

app.controller('NoteCtrl', function($scope) {
    $scope.allNotes = [{
        "Note": {
            "id": "1",
            "clas": "test",
            "obj_id": null,
            "note": "test"
        }       
    }];
});

用这个新范围替换对 api/json 的任何引用,即更改

var notes = $resource('/index.php/notes/:id.json'); 

到:

var notes = $scope.allNotes;

...然后测试。如果一切顺利,那么它不是你的角度也不是你的 json,它可能是你的 php.ini 文件。这至少会缩小故障排除想法列表中的范围。

于 2013-12-22T04:04:41.280 回答
0

我收到此错误是因为我在同一个 Angular.js 控制器中有两个请求:

 function UserCtrl($scope, $resource, $routeParams, API) {
   $scope.users = API.Users.query();
   $scope.user = API.Users.get({ id:$routeParams.id });
 };

因此,在一页上,您会收到错误,但在另一页上不会。

这是实现它的另一种方法(反映第 11 步的电话教程 - http://docs.angularjs.org/tutorial/step_11):

<div class="container" style="border:solid 1px grey">
  <div ng-view>
  </div>
</div>

<script>
  var app = angular.module('myApp', ['ngRoute', 'ngResource']);

  app.config(function($routeProvider) {
    $routeProvider.when('/users/', { templateUrl: 'assets/users/index.html', controller: UserListCtrl });
    $routeProvider.when('/users/:id', { templateUrl: 'assets/users/show.html', controller: UserCtrl });
 });

  app.factory('API', ['$resource', function($resource) {
    return {
      Users: $resource('/users/:id.json')
    };
  }]);

  function UserListCtrl($scope, $resource, API) {
    $scope.users = API.Users.query();
  };

  function UserCtrl($scope, $resource, $routeParams, API) {
    $scope.user = API.Users.get({ id:$routeParams.id });
  };

</script>
于 2014-01-22T22:57:35.977 回答