2013-02-20 66 views
6

我有.NET WCF服務提供REST服務。一切都適用於我,直到我試圖用嵌套對象發送對象。然後我在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檢查檢查一下服務器返回? – 2013-02-20 07:18:13

+0

當然,它是JSON結構的一部分。它是服務器響應。 – Fanda 2013-02-20 07:42:57

回答

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:您的控制檯可能顯示錯誤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'} }; 
+0

它的工作原理,謝謝。我現在如何在視圖中訪問嵌套數組? – Fanda 2013-02-20 08:38:58

+0

資源返回一個包含兩個數組的對象,稱爲「角色」和「子角色」。你可以分別使用'privileges.Roles'和'privileges.SubRoles'來引用它們。我用一個例子更新了plnkr。 – Gloopy 2013-02-20 08:45:51

+0

我正在通過這種方式嘗試,但它需要更改後更深層次的瀏覽器刷新。非常感謝您的幫助。 – Fanda 2013-02-20 11:55:24