2014-06-25 3 views
9

Angenommen, ich muss einen GroupId-Parameter zu jeder Anfrage des Benutzers hinzufügen, aber ich möchte nicht jeden Service-Aufruf ändern. Ist es möglich, diese GroupId automatisch an alle Anfragen anzuhängen, egal ob es sich um eine POST- oder GET-Abfragezeichenfolge handelt?

Ich habe mich in die Interceptor request Funktion, kann aber nicht herausfinden, wie die Änderung vorzunehmen

** ** Bearbeiten

Aktuelle Arbeitsprobe ist eine Combo von Morgan Delaney und haimlit der Vorschläge (ich denke, es ist sowieso eine Combom). Die Grundidee ist, dass, wenn die Anfrage ein POST ist, ändern Sie config.data. Ändern Sie für GET params. Scheint so weit zu arbeiten.

Noch nicht klar, wie das Provider-System in Angular funktioniert, also bin ich mir nicht sicher, ob es völlig passend ist, die data.params-Eigenschaften hier zu ändern.

.config(['$httpProvider', function ($httpProvider) { 
    $httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function ($rootScope, $q, httpBuffer) { 
     return { 

      request: function (config) { 

       if (config.data === undefined) { 
        //Do nothing if data is not originally supplied from the calling method 
       } 
       else { 
        config.data.GroupId = 7; 
       } 

       if (config.method === 'GET') { 
        if (config.params === undefined) { 
         config.params = {}; 
        } 
        config.params.GroupId = 7; 
        console.log(config.params); 
       } 

       return config; 
      } 
     }; 
    } ]); 
} ]); 
+1

Sie könnten eine Verknüpfung Dienst erstellen und es etwas nennen wie 'shortcut.get (url, Daten)' die Ihre Config alle anhängen würde Daten dann wieder die ' $ http Versprechen. http://stackoverflow.com/questions/17497006/use-http-inside-custom-provider-in-app-config-angular-js –

+1

Hier ist ein Link mit nützlichen Beispielen. Wenn du es immer noch nicht zur Arbeit bekommst, poste einen Plunker mit dem, was du ausprobiert hast. http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/ – haimlit

+0

@Morgan Delaney Danke. Ich habe meine Frage so aktualisiert, wie ich sie gerade habe. Hat die Art und Weise, wie ich es tat, irgendwelche negativen Konsequenzen im Vergleich zu der Art, wie Sie es vorgeschlagen haben? – Cabbagesocks

Antwort

7

Wenn Ihr Beispiel funktioniert, großartig. Aber es scheint Semotik IMHO zu fehlen.

In meinen Kommentaren erwähnte ich die Erstellung eines Dienstes, aber ich habe ein Beispiel Plunker mit einer Fabrik eingerichtet.

Plunker

Relevante Code:

angular.module('myApp', []) 
    .factory('myHttp', ['$http', function($http) 
    { 
    return function(method, url, args) 
    { 
     // This is where the magic happens: the default config 
     var data = angular.extend({ 
     GroupId: 7 
     }, args); 

     // Return the $http promise as normal, as if we had just 
     // called get or post 
     return $http[ method ](url, data); 
    }; 
    }]) 
    .controller('myCtrl', function($scope, $http, myHttp) 
    { 
    // We'll loop through config when we hear back from $http 
    $scope.config = {}; 

    // Just for highlighting 
    $scope.approved_keys = [ 'GroupId', 'newkey' ]; 

    // Call our custom factory 
    myHttp('get', 'index.html', { newkey: 'arg' }).then(function(json) 
    { 
     $scope.config = json.config; 
    }); 
    }); 
+0

Das ist viel besser als meins, ich kann sehen, was du meinst. Dies ist viel klarer darüber, was passiert. Aber wo sagt man "Call your custom factory", warum passiert das? Soll Angular die Fabriken (Anbieter?) Nicht selbst laufen lassen, während wir die Dienste nutzen? – Cabbagesocks

+1

Angular hat seine eigenen Anbieter, Dienstleistungen und Fabriken. Sie haben alle das Präfix "$" vor ihrem Namen. Im obigen Beispiel ist "$ http" ein Angular-Dienst, während "myHttp" (Name ist beliebig) eine vom Benutzer konfigurierte Factory ist. –

Verwandte Themen