2013-07-02 30 views
11

Tôi đã tạo ra một dịch vụ góc để nói về một máy chủ REST đơn giản được thực hiện bằng PHP. Tôi có thể thấy rằng tôi có thể nhận được một bản ghi, danh sách tất cả bản ghi và thêm bản ghi mới, tuy nhiên, sau khi thêm bản ghi mới, tôi gặp sự cố khi nhận phản hồi chính xác từ máy chủ để có thể thực hiện.AngularJS với ngResource: Cách kiểm tra phản hồi chính xác từ máy chủ?

Tôi biết nó làm việc vì kỷ lục mới đang nhận được thêm, tuy nhiên, tôi muốn đưa thông báo cho người dùng nếu vì bất cứ lý do yêu cầu không làm việc, và vân vân ...

Đây là dịch vụ:

angular.module('adminApp.services', ['ngResource']) 

    .factory('Settings', function($resource) { 

     return $resource('rest/setting/:id', {id: '@id'}, { 
      'query' : { method: 'GET', params: {}, format: 'json', isArray: true }, 
      'save' : { method: 'POST', params: {}, format: 'json', isArray: true }, 
      'get' : { method: 'GET', params: {}, format: 'json', isArray: false }, 
      'update': { method: 'PUT', params: {id: '@id'}, format: 'json', isArray: true }, 
      'delete': { method: 'DELETE', params: {id: '@id'}, format: 'json', isArray: false } 
    }); 

}); 

là một phần của bộ điều khiển, tôi có như sau:

$scope.save = function() { 
    var result = Settings.save({}, $scope.settings); 

    console.log(result); 

    // Here I would like to send the result to the dialog 
    // to determine wether or not the request was successful 
    // dialog.close(result); 
}; 

Câu trả lời Mạng từ yêu cầu HTTP, như đã thấy qua giao diện điều khiển retur javascript ns 'true' quay trở lại từ máy chủ, tuy nhiên, console.log (kết quả) trả về một mảng các ký tự trong 'true' - tôi đã đoán điều này là do tùy chọn isArray: true trong 'save' là cần thiết vì params được gửi đến máy chủ như là một mảng mặc dù:

[$promise: Object, $resolved: false] 
    0: "t", 
    1: "r", 
    2: "u", 
    3: "e", 
    $promise: Object, 

    // I tried passing result.$resolved to the dialog, 
    // but if yousee above it resolves to false up top first 
    $resolved: true, 
    length: 4, 
    __proto__: Array[0] 

tôi biết các phản ứng HTTP là một giá trị json của sự thật, nếu tôi có thể móc vào đó nó sẽ được dễ dàng (tôi đến từ một nền tảng jQuery , có lẽ tôi đang làm sai, tôi đã làm cho nó một điểm để loại bỏ jQuery hoàn toàn từ dự án này là không cho phép nó để ức chế học tập của tôi).

Tôi đoán câu hỏi là, làm cách nào để thực sự nhận được phản hồi đó từ máy chủ lên biến JS mà tôi thực sự có thể làm việc cùng?

Edit: Cập nhật

tôi đã thay đổi dịch vụ của tôi để:

angular.module('adminApp.services', ['ngResource']) 
    .factory('Settings', function($http, $resource, $log) { 
     return $resource('rest/setting/:id', {id: '@id'}, { 
      save : { 
      method: 'POST', 
      params: {}, 
      format: 'json', 
      isArray: true, 
      transformResponse: [function(data, headersGetter) { 
       $log.info(data); // returns true 
       return { response: data }; 
      }].concat($http.defaults.transformResponse) 
     }, 
     update : { method: 'PUT', params: {id: '@id'}, format: 'json', isArray: true }, 
     delete : { method: 'DELETE', params: {id: '@id'}, format: 'json', isArray: false } 
    }); 

}); 

Và cuộc gọi đến:

$scope.save = function() { 
    $scope.results = Settings.save({}, $scope.settings); 
    console.log($scope.results); // Still returns the response with $promise 
    //dialog.close(true); 
}; 

Nhưng tôi vẫn không nhận được đúng như phản ứng

+0

Tôi hy vọng tôi hiểu được sự cố. Thử thêm hai cuộc gọi lại vào cuộc gọi 'Settings.save' của bạn. Họ là những callbacks thành công và thất bại tương ứng. Xem tại đây: http://docs.angularjs.org/api/ngResource.$resource. Tôi cho rằng bạn có thể hiển thị mã lỗi từ cuộc gọi lại thứ hai của mình. – akonsu

+0

Tôi khá chắc chắn rằng bạn không cần isArray cho dữ liệu được gửi là một mảng, nó chỉ sửa đổi cách hiểu giá trị trả về http://docs.angularjs.org/api/ngResource.$resource – shaunhusain

+0

@shaunhusain Khi tôi có isArray: false Tôi sẽ nhận được một thông báo lỗi rằng biến push không có sẵn, một số googling tiết lộ rằng điều này đã được cố định bằng cách thêm isArray: true cho cuộc gọi. –

Trả lời

13

Xem mục này: http://jsfiddle.net/moderndegree/Kn3Tc/

angular.module('myApp', ['ngResource']). 
factory('myService', function($http, $resource, $log){ 
    return $resource('/', {}, { 
     get: { 
      method: 'GET', 
      transformRequest: [function(data, headersGetter){ 
       // you can examine the raw request in here 
       $log.info(data); 
       $log.info(headersGetter()); 
      }].concat($http.defaults.transformRequest), 
      transformResponse: [function (data, headersGetter) { 
       // you can examine the raw response in here 
       $log.info(data); 
       $log.info(headersGetter()); 
       return {tada:"Check your console"}; 
      }].concat($http.defaults.transformResponse) 
     } 
    }); 
}). 
controller('myController', function(myService, $scope, $resource, $http, $log) { 
    $scope.results = myService.get(); 
}); 

Để trên toàn cầu tăng thêm hoặc ghi đè lên các biến đổi mặc định, sửa đổi $ httpProvider.defaults.transformRequest và $ httpProvider.defaults.transformResponse tài sản.

đọc thêm tại đây: http://docs.angularjs.org/api/ng.$ http

+0

Ah cái này rất hay, vì vậy cái này cho phép cái gì đó giống như "kẻ đánh chặn" ở phía khách hàng? – shaunhusain

+0

Chính xác. Nếu bạn muốn một trình chặn chặn toàn cầu, bạn có thể thêm nó vào $ httpProvider trong cấu hình ứng dụng của bạn. –

+0

Tôi đã thử nghiệm với fiddle của bạn và cố gắng sửa đổi câu trả lời của tôi, nhưng vẫn gặp sự cố. Có thể bạn hãy xem và bình luận? Tôi phải làm một cái gì đó sai vì tôi không nhận được phản ứng chuyển đổi ở cuối bộ điều khiển. –

0

Xin chào tôi biết quá muộn nhưng có thể hữu ích cho người khác, Lý do đằng sau việc chuyển đổi phản hồi thành mảng là, tài nguyên góc mong đợi thuộc tính "dữ liệu" phản hồi và sau đó nó lặp qua từng mục bên trong "dữ liệu" nhưng nếu bạn gửi một chuỗi bên trong thuộc tính dữ liệu từ máy chủ như

response = { 
    data: true 
    } 

sau đó lặp góc tài nguyên này trong "dữ liệu" Đối tượng và làm cho một loạt các dữ liệu như vậy, một cách chính xác là gửi trả lời là như thế này

response = { 
    data: {users: users} // Or any other property but not directly data 
    } 

Cảm ơn

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