2013-02-20 68 views
6

Tôi có dịch vụ .NET WCF cung cấp dịch vụ REST. Mọi thứ hoạt động cho tôi, cho đến khi tôi cố gắng gửi đối tượng với các đối tượng lồng nhau. Sau đó, tôi không nhận được gì trong angularjs. Làm thế nào tôi có thể sử dụng/truy cập đối tượng lồng nhau để trao đổi dữ liệu?

NET dịch vụ phần:

[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 cấu trúc:

{ 
"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 dịch vụ:

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

Angularjs lấy phần:

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

Tại sao các đặc quyền vẫn trống khi JSON có đối tượng lồng nhau? Và cách truy cập các đối tượng lồng nhau trong khung nhìn?

+0

Bạn đã kiểm tra tại bất kỳ công cụ dev như Firebug hoặc Chrome Inspector cho những gì các máy chủ đang trở lại? –

+0

Tất nhiên, nó là phần cấu trúc JSON. Nó là đáp ứng của máy chủ. – Fanda

Trả lời

8

Khi bạn sử dụng dịch vụ $resource hành động .query giả định phản hồi của bạn là một mảng. Bạn có thể xác định rằng các phản ứng không phải là một mảng khi sử dụng .query bằng cách xác định nó khi tạo tài nguyên với tham số thứ ba dưới đây:

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

Check-out this plnkr cho một ví dụ. Nếu bạn đưa ra các {'query': {method:'GET', isArray:false}} phản ứng của bạn sẽ là một mảng trống.

Lưu ý 1: bảng điều khiển của bạn có thể hiển thị lỗi TypeError: Object #<Resource> has no method 'push', khi làm việc với .query, thường có nghĩa là một mảng được mong đợi từ cuộc gọi REST của bạn.

Note 2: giá trị mặc định hành động tài nguyên được mô tả trong tài liệu $resource như sau:

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

Nó hoạt động, cảm ơn bạn. Làm thế nào tôi có thể truy cập vào các mảng lồng nhau trong khung nhìn? – Fanda

+0

Tài nguyên trả về một đối tượng có hai mảng trong nó được gọi là 'Roles' và' SubRoles'. Bạn có thể tham khảo chúng bằng cách sử dụng 'privile.Roles' và' privile.SubRoles' tương ứng. Tôi đã cập nhật plnkr với một ví dụ. – Gloopy

+0

Tôi đã thử nó bằng cách này, nhưng nó cần làm mới trình duyệt sâu hơn sau khi thay đổi. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn. – Fanda

Các vấn đề liên quan