2014-06-25 23 views
9

Powiedz, że muszę podać parametr GroupId dla każdego żądania użytkownika, ale nie chcę modyfikować każdego zgłoszenia serwisowego, aby je uwzględnić. Czy to możliwe, aby GroupId był automatycznie dołączany do wszystkich żądań, niezależnie od tego, czy jest to ciąg znaków zapytania POST czy GET?

czekałem do funkcji przechwytujących request, ale nie można dowiedzieć się, jak wprowadzać zmiany

** Edycja **

Aktualny próbka poniżej roboczego jest combo Morgan Delaney i haimlit-tych sugestie (myślę, że i tak jest to przeczucie). Podstawową ideą jest to, że jeśli żądanie jest POST, zmodyfikuj config.data. W przypadku GET zmień params. Wydaje się działać do tej pory.

Nadal nie wiadomo, jak działa system dostawcy w Angular, więc nie jestem pewien, czy modyfikowanie właściwości data.params jest całkowicie odpowiednie.

.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

Można utworzyć usługę skrótów i nazywają to coś takiego jak 'shortcut.get (url, data)', która dołączy wszystkie dane konfiguracyjne następnie zwracają ' obietnica $ http'. http://stackoverflow.com/questions/17497006/use-http-inside-custom-provider-in-app-config-angular-js –

+1

Oto link z przydatnymi przykładami. Jeśli nadal nie możesz go uruchomić, opublikuj plunkera tym, co próbowałeś, proszę. http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/ – haimlit

+0

@Morgan Delaney Thanks. Zaktualizowałem moje pytanie tak, jak mam to obecnie działa. Czy sposób, w jaki podjąłem, ma jakieś negatywne konsekwencje w porównaniu z tym, co sugerowałeś? – Cabbagesocks

Odpowiedz

7

Jeśli twój przykład działa, świetnie. Ale wydaje się brakować semantyki IMHO.

W moich komentarzach wspomniałem o tworzeniu usługi, ale stworzyłem przykład Plunkera przy użyciu fabryki.

Plunker

odpowiedni kod:

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

To jest lepsze niż moje, mogę zobaczyć, co masz na myśli. To jest o wiele jaśniejsze o tym, co się dzieje. Ale gdzie mówisz "Zadzwoń do naszej fabryki", dlaczego tak się dzieje? Czy nie powinniśmy pozwolić Angularowi prowadzić fabryki (dostawcy?) Podczas korzystania z naszych usług? – Cabbagesocks

+1

Angular ma swoich dostawców, usługi i fabryki. Wszystkie są poprzedzone przedrostkiem '$'. Tak więc w powyższym przykładzie '$ http' jest usługą Angular, podczas gdy' myHttp' (nazwa jest dowolna) jest fabryką skonfigurowaną przez użytkownika. –