Ho creato un servizio angolare per rispondere a un semplice server REST realizzato in PHP. Vedo che sono in grado di ottenere un singolo record, un elenco di tutti i record e aggiungere nuovi record, tuttavia, dopo aver aggiunto nuovi record, sto avendo un problema con la risposta corretta dal server per poter agire su di esso.AngularJS con ngResource: come verificare la risposta esatta dal server?
So che sta funzionando, perché sono sempre aggiunti i nuovi record, però, voglio mettere le notifiche per gli utenti, se per qualsiasi motivo la richiesta non funziona, e così via ...
Questo è il servizio:
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 }
});
});
come parte del regolatore, ho il seguente:
$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);
};
la risposta di rete dalla richiesta HTTP, come si è visto attraverso la console JavaScript retur ns 'true' che ritorna dal server, tuttavia, console.log (risultato) restituisce una matrice di caratteri in 'true' - avevo indovinato che ciò è dovuto all'array: true option in 'save' che è necessario perché i params vengono inviati al server come un array se:
[$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]
so che la risposta HTTP è un valore jSON di vero, se potessi collegare in che sarebbe stato facile (io vengo da un background jQuery , forse sto sbagliando, ho deciso di rimuovere jQuery completamente da questo progetto per non permetterlo di inibire il mio apprendimento).
Suppongo che la domanda sia: come posso ottenere effettivamente la risposta dal server su una variabile JS con cui posso effettivamente lavorare?
Modifica: Aggiornato
ho cambiato il mio servizio a:
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 }
});
});
e la chiamata a:
$scope.save = function() {
$scope.results = Settings.save({}, $scope.settings);
console.log($scope.results); // Still returns the response with $promise
//dialog.close(true);
};
Ma sto ancora non ottenere vero come la risposta
Spero di aver capito il problema. Prova ad aggiungere due callback alla tua chiamata 'Settings.save'. Sono rispettivamente i callback di successo e di fallimento. Vedi qui: http://docs.angularjs.org/api/ngResource.$resource. Suppongo che tu possa mostrare il codice di errore dal tuo secondo callback. – akonsu
Sono abbastanza sicuro che non hai bisogno di isArray perché i dati inviati siano un array, ma modifica l'interpretazione del valore di ritorno http://docs.angularjs.org/api/ngResource.$resource – shaunhusain
@shaunhusain Quando ho avuto isArray: false Avrei ricevuto un errore per segnalare che la variabile push non era disponibile, alcuni googling hanno rivelato che questo problema veniva corretto aggiungendo isArray: true alla chiamata. –