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ź
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
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
@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. –