2013-02-20 22 views
6

Ich habe .NET WCF-Dienst bietet REST-Dienst. Alles funktioniert für mich, bis ich versuche, Objekte mit verschachtelten Objekten zu senden. Dann bekomme ich nichts in angularjs. Wie kann ich verschachtelte Objekte für den Datenaustausch verwenden/darauf zugreifen?

.NET Service Teil:

[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 Struktur:

{ 
"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 Service:

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

AngularJS Holen Teil:

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

Warum Berechtigungen bleiben leer, wenn JSON Objekte verschachtelt hat? Und wie kann man auf verschachtelte Objekte in der Ansicht zugreifen?

+0

Haben Sie in allen möglichen Entwickler-Tools wie Firebug oder Chrome Inspector überprüft, was der Server zurückgibt? –

+0

Natürlich ist es der JSON-Strukturteil. Es ist die Serverantwort. – Fanda

Antwort

8

Wenn Sie den $resource Dienst der .query Aktion übernimmt Ihre Antwort ein Array ist. Sie können angeben, dass die Antwort nicht ein Array ist, wenn .query Verwendung durch die Angabe, wann die Ressource mit dem dritten Parameter zu schaffen unter:

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

Siehe this plnkr für ein Beispiel. Wenn Sie die {'query': {method:'GET', isArray:false}} herausnehmen, wird Ihre Antwort ein leeres Array sein.

Anmerkung 1: Konsole wahrscheinlich einen Fehler zeigt TypeError: Object #<Resource> has no method 'push' die, wenn sie mit .query arbeiten, bedeutet in der Regel eine Reihe von Ihrem REST Anruf erwartet wird.

Anmerkung 2: die Ressourcenaktion Standardwerte sind in der $resource Dokumentation wie folgt beschrieben:

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

Es funktioniert, danke. Wie kann ich nun auf verschachtelte Arrays in der Ansicht zugreifen? – Fanda

+0

Die Ressource gibt ein Objekt mit zwei Arrays namens 'Roles' und' SubRoles' zurück. Sie können sie mit 'privileges.Roles' bzw.' privileges.SubRoles' referenzieren. Ich habe die PLNKR mit einem Beispiel aktualisiert. – Gloopy

+0

Ich habe es auf diese Weise versucht, aber es braucht eine tiefere Aktualisierung des Browsers nach Änderungen. Vielen Dank für Ihre Hilfe. – Fanda

Verwandte Themen