2013-07-02 8 views
11

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

+0

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

+0

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

+0

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

risposta

13

Vedere questo tipo di violino: 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(); 
}); 

globalmente aumentare o sovrascrivere le trasformazioni di default, modificare le $ httpProvider.defaults.transformRequest e $ httpProvider.defaults.transformResponse proprietà.

leggere più qui: http://docs.angularjs.org/api/ng.$ http

+0

Ah questo è molto bello, quindi questo permette qualcosa come "intercettori" sul lato client? – shaunhusain

+0

corretto. Se si desidera un intercettore globale, è possibile aggiungerlo a $ httpProvider nella configurazione dell'app. –

+0

Ho fatto esperimenti con il violino e ho provato a modificare la mia risposta, ma ho ancora problemi. Potresti per favore dare un'occhiata e commentare? Devo fare qualcosa di sbagliato in quanto non ricevo la risposta trasformata alla fine del controller. –

0

Ciao, so che è troppo tardi, ma potrebbe essere utile per gli altri, La ragione dietro la conversione della risposta all'array è, la risorsa angolare si aspetta la proprietà "dati" in risposta e dopo di essa itera su ogni elemento all'interno del "dati", ma se si invia una stringa all'interno della proprietà dei dati dal server come questo

response = { 
    data: true 
    } 

poi angolare risorsa iterate sopra l'oggetto "dati" e ti fa una serie di dati in modo, il modo corretto è quello di inviare la risposta è così

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

Grazie

Problemi correlati