web-dev-qa-db-fra.com

AngularJS $ intercepteurs de ressources

Comment ajouter des intercepteurs à un appel $resource?

Disons que j'ai une usine de ressources appelée Users, comme ceci;

app.factory('Users', ['$resource', 'resourceInterceptor',
  function ($resource, resourceInterceptor) {
    return $resource(
      'users/:user_id',
      {
        user_id: '@id'
      },
      {
        query: {
          method: 'GET', // Not changing the default method, just adding an interceptor
          interceptor: resourceInterceptor // Is there any better way to do this.. like globally?
        },
        save: {
          method: 'POST', // Same here
          interceptor: resourceInterceptor // Again...
        },
        ..., // And so on
      }
    );
  }]);

et mon service resourceInterceptor ressemble à;

app.factory('resourceInterceptor', ['$rootScope',
  function ($rootScope) {
    return {
      request: function () {
        // This function isn't executed at all?
        $rootScope.loading = true;
      },
      response: function () {
        $rootScope.loading = false;
      },
      responseError: function () {
        $rootScope.loading = false;
      }
    };
  }]);

Tout d’abord, la fonction request intercept n’est jamais exécutée, pourquoi pas?

Deuxièmement, il est très fastidieux de coder l’intercepteur dans les méthodes $resource existantes. Existe-t-il un moyen plus simple d’affecter des intercepteurs à des appels $resource spécifiques, voire d’assigner un intercepteur à tous les appels $resource?

15
Unidan

Pour utiliser un intercepteur dans une ressource, vous devez:

1 - Créez un httpInterceptor avec votre requête, réponse, responseError:

app.factory('myInterceptor', function () {
    //Code
    //return { request:...,
});

2 - Configurez cet intercepteur dans votre application:

app.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.Push('myInterceptor');
}]);

À l’heure actuelle, puisque vous avez configuré votre fournisseur httpProvider pour qu’il dispose d’un intercepteur où que vous injectiez $ http, vous utiliserez ce fournisseur afin ... d'exécuter vos fonctions de requête, de réponse et de réponse d'erreur.

3 - Utilisation dans une ressource. En tant que $ ressource utilisez $ http et que vous avez config un httpProvider globalement, vous appelez la fonction de vos intercepteurs lorsque vous utilisez votre ressource.

Deuxième question: Vous ne pouvez pas définir un intercepteur sur un objet concret $ http, ils (les intercepteurs) sont définis globalement.

(Même si vous définissez l'intercepteur avant la définition de votre module et que vous le supprimez, vous ne pouvez pas connaître l'ordre d'exécution)

Ce que vous pouvez faire si vous ne souhaitez pas remplacer la propriété interceptor dans chaque action $ resource (au fur et à mesure que vous écrivez dans votre question), vous pouvez améliorer votre intercepteur.

app.factory('userLoadingInterceptor', function () {
    //Code
    return {
        request: function(){
            //Check if your are working with a url related with users
            // and if so do things...
        }
});
15
JDL

De la docs:

L'objet intercepteur a deux méthodes facultatives - response et responseError

Je ne sais pas ce que vous voulez atteindre, mais des intercepteurs HTTP génériques pourraient constituer une alternative.

0
a better oliver

Un intercepteur HTTP générique doit faire ce que vous voulez. Vous pouvez trouver un exemple ici: Traitement de la réponse HTTP 302 à partir d'un proxy dans angularjs

0
MBielski