2013-07-02 15 views
11

Stworzyłem kanciasty serwis, aby rozmawiać z prostym serwerem REST wykonanym w PHP. Widzę, że jestem w stanie uzyskać pojedynczy rekord, listę wszystkich rekordów i dodać nowe rekordy, jednak po dodaniu nowych rekordów mam problem z uzyskaniem prawidłowej odpowiedzi z serwera, aby móc na nim działać.AngularJS with ngResource: Jak sprawdzić dokładną odpowiedź z serwera?

wiem, że to działa, ponieważ nowe rekordy są dodawane uzyskiwanie jednak pragnę umieścić informację dla użytkowników, jeśli z jakiegoś powodu żądanie nie działa, i tak dalej ...

To jest usługa:

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

}); 

jako część sterownika, mam następujące:

$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); 
}; 

odpowiedź sieciowe z żądania HTTP, jak widać za pośrednictwem konsoli javascript RETUR ns 'true', który powraca z serwera, jednak console.log (result) zwraca tablicę znaków w 'true' - zgadłem, że jest tak z powodu isArray: true opcja w 'save', która jest konieczne, ponieważ params wysyłane do serwera jako tablica mimo:

[$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] 

znam odpowiedź HTTP jest wartością json z prawdą, czy mogę podpiąć się, że to będzie łatwe (pochodzę z jQuery tle , może robię to źle, zrobiłem to, aby całkowicie usunąć jQuery z tego projektu, aby nie dopuścić do zahamowania mojej nauki).

Domyślam się, że pytanie brzmi: w jaki sposób mogę uzyskać tę odpowiedź z serwera na zmienną JS, z którą mogę pracować?

Edit: Updated

zmieniłem usługę:

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

}); 

I wywołanie:

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

Ale ja wciąż nie prawda jako odpowiedź

+0

Mam nadzieję, że rozumiem problem. Spróbuj dodać dwa wywołania zwrotne do połączenia 'Settings.save'. Są to odpowiednio wywołania zwrotne dotyczące sukcesu i niepowodzeń. Zobacz tutaj: http://docs.angularjs.org/api/ngResource.$resource. Przypuszczam, że możesz pokazać kod błędu z drugiego wywołania zwrotnego. – akonsu

+0

Jestem prawie pewien, że nie potrzebujesz isArray, aby wysłane dane były tablicą, po prostu modyfikuje interpretację wartości zwracanej http://docs.angularjs.org/api/ngResource.$resource – shaunhusain

+0

@shaunhusain Kiedy miałem isArray: false Otrzymałbym komunikat o błędzie informujący, że zmienna push nie była dostępna, niektóre google ujawniły, że zostało to naprawione przez dodanie isArray: true do wywołania. –

Odpowiedz

13

Zobacz to skrzypce: 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(); 
}); 

Aby globalnie Rozszerz lub nadpisać domyślne przekształca zmodyfikować $ httpProvider.defaults.transformRequest i $ httpProvider.defaults.transformResponse właściwości.

czytaj więcej tutaj: http://docs.angularjs.org/api/ng.$ http

+0

Ah to jest bardzo fajne, więc to pozwala na coś w stylu "przechwytujących" po stronie klienta? – shaunhusain

+0

Prawidłowo. Jeśli chcesz globalnego przechwytywacza, możesz dodać go do $ httpProvider w konfiguracji aplikacji. –

+0

Eksperymentowałem z twoimi skrzypcami i próbowałem poprawić odpowiedź, ale nadal mam problemy. Czy możesz rzucić okiem i skomentować? Muszę zrobić coś złego, ponieważ nie otrzymuję transformowanej odpowiedzi na końcu kontrolera. –

0

Witam wiem, że jest za późno, ale może być pomocny dla innych, Powodem konwersji odpowiedzi na tablicę jest, kątowe-zasób oczekuje właściwości "danych" w odpowiedzi, a następnie iteruje każdy element wewnątrz „dane”, ale jeśli wysyła ciąg wewnątrz obiektu danych z serwera jak to

response = { 
    data: true 
    } 

następnie iteracyjne kątowa-zasobu za pośrednictwem „dane” Object i sprawia tablicę danych tak, to poprawne sposobem jest wysłać odpowiedź jest taki:

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

Dzięki

Powiązane problemy