2013-12-19 60 views
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內置的,那就是烤使你正被序列化的香草視圖功能。

+0

它會更容易,如果我們能看到一個plunker。在此之前,什麼可能完全離開牆壁,但我想問問:你能改變你的JSON標籤嗎?有沒有可能在json解析出來時重複「note」引起混淆? – kl02

+0

我不知道如何欺騙搶劫者的api電話。我可以用代碼更新。 –

+0

Ohhhh php。以下是欺騙api的最簡單方法:http://plnkr.co/edit/46V2g8rlrwlrAxsZ81dX?p=preview。只需創建另一個控制器,將json放在範圍上,然後在其上運行工廠。 (替代方法是創建一個靜態json文件並調用它)。這會讓你檢查是否是json本身觸發錯誤,如果沒有,至少可以將其從罪犯列表中刪除。 – kl02

回答

0

我想所有其他人都知道有一個解決方案(或至少是一個的閃光),我會在這裏做一個正式的答案。看到php如何不在本地講述json,它會產生角度無法解析的可疑形式的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。這至少會將問題縮小到排除故障的想法列表中。

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

所以在一個頁面上,你會得到錯誤,但不是在其他:

+0

標記爲答案,因爲它導致我真正的問題。我認爲問題實際上是在ui路由器中。問題在於它每次加載頁面加載控制器兩次。它第一次傳入的id爲null,因此它試圖從蛋糕中提取一個索引。我所要做的就是在調用資源之前檢查ID。我會和ui-router團隊一起來看看我能否得到真正的解決方案。謝謝@ kl02所有的幫助。 –

0

,因爲我曾在同一Angular.js控制器兩個請求我得到這個錯誤。

這裏是另一種方式來實現這一目標(即反映在步驟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> 
相關問題