6

RESTサービスを提供する.NETWCFサービスがあります。ネストされたオブジェクトを含むオブジェクトを送信しようとするまで、すべてがうまくいきます。それから私はangularjsで何も得ていません。データ交換のためにネストされたオブジェクトを使用/アクセスするにはどうすればよいですか?

.NETサービス部分:

[OperationContract] // route prefix 'api'
    [WebGet(UriTemplate = "users/{id}/privileges", ResponseFormat = WebMessageFormat.Json)]
    public PrivilegeSet GetPrivileges(string id)
    {
        var response = new PrivilegeSet();

        List<Role> roles = new List<Role>();
        roles.Add(new Role() { RoleId = 1, Name = "Role 1", Active = true });
        roles.Add(new Role() { RoleId = 2, Name = "Role 2", Active = true });
        roles.Add(new Role() { RoleId = 3, Name = "Role 3", Active = false });
        response.Roles = roles;

        List<SubRole> subRoles = new List<SubRole>();
        subRoles.Add(new SubRole() { SubRoleId = 1, Name = "SubRole 1", RoleId = 1, Active = true });
        subRoles.Add(new SubRole() { SubRoleId = 2, Name = "SubRole 2", RoleId = 1, Active = true });
        subRoles.Add(new SubRole() { SubRoleId = 3, Name = "SubRole 3", RoleId = 1, Active = false });
        response.SubRoles = subRoles;

        return response;
    }

JSON構造:

{
"Roles": [
{
  "Active": true,
  "Name": "Role 1",
  "RoleId": 1
},
{
  "Active": true,
  "Name": "Role 2",
  "RoleId": 2
},
{
  "Active": false,
  "Name": "Role 3",
  "RoleId": 3
}
],
"SubRoles": [
{
  "Active": true,
  "Name": "SubRole 1",
  "RoleId": 1,
  "SubRoleId": 1
},
{
  "Active": true,
  "Name": "SubRole 2",
  "RoleId": 1,
  "SubRoleId": 2
},
{
  "Active": false,
  "Name": "SubRole 3",
  "RoleId": 1,
  "SubRoleId": 3
}
]
}

Angularjsサービス:

angular.module('privilegeService', ['ngResource']).
    factory('Privilege', function ($resource) {
        return $resource('api/users/:userId/privileges', {userId: '@id'});
    });

Angularjsフェッチ部分:

function PrivilegesCtrl($scope, Privilege) {
    $scope.privileges = Privilege.query({userId:2}); // privileges remains empty using nested objects, with one level object works fine
    ...

JSONにネストされたオブジェクトがあるのに、なぜ特権が空のままになるのですか?そして、ビュー内のネストされたオブジェクトにアクセスする方法は?

4

1 に答える 1

8

$resourceサービスを使用すると、.queryアクションは応答が配列であると想定します。.query以下の 3 番目のパラメーターでリソースを作成するときに指定することで、使用時に応答が配列ではないことを指定できます。

angular.module('privilegeService', ['ngResource']).
    factory('Privilege', function ($resource) {
        return $resource('api/users/:userId/privileges', 
                         {userId: '@id'}, 
                         {'query':  {method:'GET', isArray:false}});
    });

例については、この plnkrを確認してください。取り出すと{'query': {method:'GET', isArray:false}}、応答は空の配列になります。

注 1:コンソールにエラーが表示される可能性がありますTypeError: Object #<Resource> has no method 'push'。これは.query、通常、REST 呼び出しから配列が予期されることを意味します。

注 2:リソース アクションのデフォルトは、$resourceドキュメントで次のように説明されています。

{ 'get':    {method:'GET'},
  'save':   {method:'POST'},
  'query':  {method:'GET', isArray:true},
  'remove': {method:'DELETE'},
  'delete': {method:'DELETE'} };
于 2013-02-20T07:34:21.150 に答える