2014-06-25 7 views
9

Dire che è necessario includere un parametro GroupId per ogni richiesta effettuata dall'utente, ma non desidero modificare ogni chiamata di servizio per includerla. È possibile rendere quel GroupId aggiunto automaticamente a tutte le richieste, che si tratti di stringa di query POST o GET?

ho cercato nella funzione intercettore request, ma non riesco a capire come fare il cambiamento

** Modifica **

campione di lavoro in corso al di sotto è un combo di Morgan Delaney e haimlit di suggerimenti (penso che sia comunque un combom). L'idea di base è che se la richiesta è un POST, modificare config.data. Per GET, modificare params. Sembra funzionare finora.

Ancora non è chiaro come funziona il sistema provider in Angular, quindi non sono sicuro che sia del tutto appropriato modificare le proprietà data.params qui.

.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

è possibile creare un servizio di collegamento e chiamarlo qualcosa come 'shortcut.get (url, dati)' che accodare tutti i dati di configurazione per poi tornare il ' promessa $ http. http://stackoverflow.com/questions/17497006/use-http-inside-custom-provider-in-app-config-angular-js –

+1

Ecco un collegamento con esempi utili. Se ancora non riesci a farlo funzionare, inserisci un plunker con quello che hai provato, per favore. http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/ – haimlit

+0

@Morgan Delaney Grazie. Ho aggiornato la mia domanda sul modo in cui la sto attualmente lavorando. Il modo in cui ho avuto conseguenze negative rispetto al modo in cui hai suggerito? – Cabbagesocks

risposta

7

Se il tuo esempio funziona, ottimo. Ma sembra mancare la semantica IMHO.

Nei miei commenti ho menzionato la creazione di un servizio ma ho creato un esempio di Plunker utilizzando una fabbrica.

Plunker

codice rilevante:

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

È molto meglio del mio, capisco cosa intendi per il mio. Questo è molto più chiaro su ciò che sta accadendo. Ma dove dici "Chiama la nostra fabbrica personalizzata", perché succede? Non dovremmo lasciare che Angular gestisca le fabbriche (provider?) Mentre noi usiamo i servizi? – Cabbagesocks

+1

Angular dispone di propri fornitori, servizi e stabilimenti. Sono tutti preceduti da un '$' prima del loro nome. Quindi nell'esempio sopra, '$ http' è un servizio angolare, mentre' myHttp' (il nome è arbitrario) è un factory configurato dall'utente. –

Problemi correlati