2013-12-14 16 views
95

Sto facendo richieste alla mia API e sto utilizzando il modulo risorsa AngularJS $. È diverso da $ http, quindi non so come gestire i miei errori.

Il mio servizio:

var appServices = angular.module('app.services', ['ngResource']); 
appServices.factory('Category', ['$resource', 
    function($resource){ 
     return $resource('/apicategoryerr/?format=:format', {}, { 
      query: { 
       method: 'GET', 
       params: { format: 'json'}, 
       isArray: true, 

      } 
     }); 
    }]); 

mio controller:

... 
Category.query(function(data) { 
       console.log(data); 
      }); 
... 

voglio qualcosa di simile a questo o .. non so un modo per gestire gli errori se il mio API non funziona ..

Category.query().success(function() { 
       console.log('success'); 
      }).error(function() { 
       console.log('error'); 
      }); 

risposta

176

è possibile passare il gestore di errori come secondo parametro query.

Category.query(function(data) {}, function() {}); 

EDIT:

per rendere le cose un po 'più chiare, alcuni esempi:

var Resource = $resource('/restapi/resource'); 

Resource.query(function(data) { 
    // success handler 
}, function(error) { 
    // error handler 
}); 

Resource.query({ 
    'query': 'thequery' 
},function(data) { 
    // success handler 
}, function(error) { 
    // error handler 
}); 

Resource.query().$promise.then(function(data) { 
    // success handler 
}, function(error) { 
    // error handler 
}); 

Resource.query({ 
    'query': 'thequery' 
}).$promise.then(function(data) { 
    // success handler 
}, function(error) { 
    // error handler 
}); 
+2

Nella documentazione sembra più che il terzo parametro sia il callback degli errori. "Resource.action ([parametri], [successo], [errore])" http://docs.angularjs.org/api/ngResource.$resource – Marcel

+0

sì, se si passa un oggetto di configurazione. –

+4

esiste un modo per definire un gestore di errori predefinito comune a tutti gli utilizzi di questa risorsa (ad es. "Risorsa non autorizzata dal server"? –

67

È possibile definire un gestore di errori nella fase di creazione della risorsa con l'aggiunta di un oggetto interceptor nella descrizione di un metodo, con una proprietà responseError, collegata alla funzione di errore.

function resourceErrorHandler(response) { ... } 

$resource('/path/:param/', {} , 
{ 
     'get': {method:'GET', 
        interceptor : {responseError : resourceErrorHandler}}, 
     'save': {method:'POST'}, 
     'query': {method:'GET', isArray:true, 
        interceptor : {responseError : resourceErrorHandler}}, 
     'remove': {method:'DELETE'}, 
     'delete': {method:'DELETE'} 
}; 

dove resourceErrorHandler è una funzione chiamata su ogni errore get o metodo di query. Per il problema richiesto, il metodo get è l'unico necessario. Naturalmente puoi applicarlo a qualsiasi azione.

Un altro intercettore response esiste per $ risorsa per ottenere una risposta normale.

{'get': {method:'GET', interceptor : {response : resourceResponseHandler}}, 

Intercettori sono parte del modulo $http, è possibile indicare più read about them in their docs.

1

Ecco un nuovo esempio ES6 (io uso dattiloscritto) sul mio ng.resource

resolve: { 
    detail: function (myService, $stateParams) { 
     return myService.getEventDetail({ id: $stateParams.id }).$promise.then(data => data, error => false); 
    } 
} 

e poi nel mio controller, 'dettaglio' iniettato il controller sarà o risolvere i dati (buono) o false per errore, dove gestisco il display di 404.

Problemi correlati