2013-02-20 11 views
6

RESTサービスを提供する.NET WCFサービスがあります。ネストされたオブジェクトを持つオブジェクトを送信しようとするまで、すべてが私のために働きます。それから、私は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にネストされたオブジェクトがある場合、権限が空のままになる理由を教えてください。ビュー内のネストされたオブジェクトにアクセスする方法は?

+0

は、サーバーが返しているもののためのFirebugやChromeインスペクタのような任意の開発ツールでチェックしましたか? –

+0

もちろん、JSON構造の部分です。それはサーバーの応答です。 – Fanda

答えて

8

$resourceサービスを使用すると、.queryアクションは応答が配列であることを前提としています。あなたは、以下の三番目のパラメータでリソースを作成するときに、それを指定することにより、.queryを使用した場合の応答が配列でないことを指定することができます。

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

例えばthis plnkrをチェックしてください。 {'query': {method:'GET', isArray:false}}を取り出すと、あなたの応答は空の配列になります。

注1:コンソールはおそらく.queryでの作業、エラーTypeError: Object #<Resource> has no method 'push'を示しているが、通常の配列は、あなたのREST呼び出しから期待されていることを意味します。

注2:次のようにリソースアクションのデフォルトは$resourceマニュアルに記載されています

{ 'get': {method:'GET'}, 
    'save': {method:'POST'}, 
    'query': {method:'GET', isArray:true}, 
    'remove': {method:'DELETE'}, 
    'delete': {method:'DELETE'} }; 
+0

それは動作します、ありがとう。ビューでネストされた配列にアクセスするにはどうすればよいですか? – Fanda

+0

リソースは、 'Roles'と' SubRoles'という2つの配列を持つオブジェクトを返します。それぞれ 'privileges.Roles'と' privileges.SubRoles'を使って参照できます。私は例を使ってplnkrを更新しました。 – Gloopy

+0

私はこの方法で試していましたが、変更後にブラウザのリフレッシュを深くする必要があります。ご助力ありがとうございます。 – Fanda

関連する問題