2013-02-20 5 views
6

Mam usługę .NET WCF zapewniającą usługę REST. Wszystko działa dla mnie, dopóki nie próbuję wysłać obiektu z zagnieżdżonymi obiektami. Wtedy dostaję nic w angularjs. Jak mogę użyć/uzyskać dostęp do zagnieżdżonego obiektu do wymiany danych?

NET część usługa:

[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; 
    } 

struktura 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 
} 
] 
} 
serwis

angularjs:

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

angularjs pobierania część:

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

Dlaczego uprawnienia pozostają puste, gdy JSON ma zagnieżdżone obiekty? A jak uzyskać dostęp do zagnieżdżonych obiektów w widoku?

+0

Czy można sprawdzić w dowolnym dev narzędzi, takich jak Firebug lub Chrome Inspektora co serwer wraca? –

+0

Oczywiście jest to część struktury JSON. To jest odpowiedź serwera. – Fanda

Odpowiedz

8

Podczas korzystania z usługi zakłada się, że Twoja odpowiedź jest tablicą. Można określić, że odpowiedź nie jest tablicą przy użyciu .query określając go podczas tworzenia zasobu z trzeciego parametru poniżej:

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

Wyjazd this plnkr dla przykładu. Jeśli usuniesz {'query': {method:'GET', isArray:false}}, twoja odpowiedź będzie pustą tablicą.

Uwaga 1: konsola jest prawdopodobne, pokazując błąd TypeError: Object #<Resource> has no method 'push' które podczas pracy z .query, oznacza zwykle tablicą oczekuje się od rozmowy REST.

Uwaga 2: domyślne działanie zasób zostały opisane w dokumentacji $resource następująco:

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

Działa, dziękuję. Jak mogę teraz uzyskać dostęp do zagnieżdżonych tablic w widoku? – Fanda

+0

Zasób zwraca obiekt z dwiema tablicami o nazwie 'Role' i' SubRoles'. Możesz odwoływać się do nich używając odpowiednio 'privileges.Roles' oraz' privileges.SubRoles'. Zaktualizowałem pnkr na przykładzie. – Gloopy

+0

Próbowałem tego w ten sposób, ale po wprowadzeniu zmian konieczne jest głębsze odświeżenie przeglądarki. Bardzo ci dziękuje za pomoc. – Fanda

Powiązane problemy