Come ottenere i parametri url usando AngularJS


199

Codice sorgente HTML

<div ng-app="">
    <div ng-controller="test">
      <div ng-address-bar browser="html5"></div>
      <br><br>
      $location.url() = {{$location.url()}}<br>
      $location.search() = {{$location.search('keyword')}}<br>
      $location.hash() = {{$location.hash()}}<br>     
      keyword valus is={{loc}} and ={{loc1}}
  </div>
</div>

Codice sorgente AngularJS

<script>
function test($scope, $location) {
  $scope.$location = $location;
  $scope.ur = $scope.$location.url('www.html.com/x.html?keyword=test#/x/u');
  $scope.loc1 = $scope.$location.search().keyword ;    
    if($location.url().indexOf('keyword') > -1){    
        $scope.loc= $location.url().split('=')[1];
        $scope.loc = $scope.loc.split("#")[0]        
    }
  }
 </script>

Qui le variabili loced loc1entrambe restituiscono il test come risultato per l'URL sopra. È questo il modo corretto?


1
Potresti voler dare un'occhiata a $ routeParams .
Nick Heiner,

Non è chiaro cosa stai chiedendo qui ... i documenti $ routeParams e $ location # dovrebbero iniziare
mazzo

7
Si prega di considerare l'aggiunta di un commento quando si vota verso il basso in modo da poter migliorare la domanda. Grazie.
praveenpds,

Risposte:


314

So che questa è una vecchia domanda, ma mi ci è voluto del tempo per risolverlo vista la scarsa documentazione angolare. Il RouteProvider e routeParams è la strada da percorrere. Il percorso collega l'URL al controller / vista e routeParams può essere passato al controller.

Dai un'occhiata al progetto del seme angolare . All'interno di app.js troverai un esempio per il provider del percorso. Per usare i parametri basta semplicemente aggiungerli in questo modo:

$routeProvider.when('/view1/:param1/:param2', {
    templateUrl: 'partials/partial1.html',    
    controller: 'MyCtrl1'
});

Quindi nel controller iniettare $ routeParams:

.controller('MyCtrl1', ['$scope','$routeParams', function($scope, $routeParams) {
  var param1 = $routeParams.param1;
  var param2 = $routeParams.param2;
  ...
}]);

Con questo approccio puoi usare i parametri con un URL come: " http://www.example.com/view1/param1/param2 "


2
Nota che l'ultima riga di questo esempio });dovrebbe essere}]);
Andrew Lank,

44
Inoltre è possibile ottenere altri parametri arbitrari nel modulo stringa di query /view/1/2?other=12con $routeParams.other
DavidC

Penso che tu abbia il 'var param1' ripetuto nel tuo controller. Non ho potuto modificare un cambiamento così semplice.
Tom,

Angular lo rende così facile, e anche la tua risposta è così bella descrittiva
Mohammad Kermani

1
Assegna e invia esempio: var param1 = "abc"; $ location.path ('/ view1 /:' + param1); $ route.reload ();
Robot70

158

Sebbene il routing sia davvero una buona soluzione per l'analisi degli URL a livello di applicazione, potresti voler utilizzare il $locationservizio di livello più basso , come iniettato nel tuo servizio o controller:

var paramValue = $location.search().myParam; 

Questa semplice sintassi funzionerà per http://example.com/path?myParam=paramValue. Tuttavia, solo se prima hai configurato la $locationProvidermodalità HTML 5:

$locationProvider.html5Mode(true);

Altrimenti dai un'occhiata alla http://example.com/#!/path?myParam=someValue sintassi "Hashbang" che è un po 'più complicata, ma ha il vantaggio di lavorare su vecchi browser (non compatibile con HTML 5) come bene.


16
sembra che tu debba aggiungere $ locationProvider.html5mode (true) come un modulo configurato in questo modo: angular.module ("myApp", []). config (function ($ locationProvider) {$ locationProvider.html5Mode (true);});
sq1020

4
E html5Mode richiede un <base href="http://example.com/en/" />tag nel tuo index.html.
cespon

1
quello che mi piace della tua soluzione è che puoi persino passare oggetti e ottenerli come oggetto.
Shilan,

2
È anche possibile non aggiungere il tag <base> e specificarlo in questo modo:.config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }); }])
Guillaume

1
In Angular 1.5.8, non ho dovuto configurare $locationProviderper farlo funzionare. http://example.com/path#?someKey=someVal, quindi $location.search().someKey // => 'someVal'
jiminikiz


11

Ho trovato la soluzione su come utilizzare $ location.search () per ottenere i parametri dall'URL

prima nell'URL devi inserire la sintassi "#" prima del parametro come in questo esempio

"http://www.example.com/page#?key=value"

e poi nel tuo controller metti $ location in funzione e usa $ location.search () per ottenere il parametro URL per

.controller('yourController', ['$scope', function($scope, $location) {

     var param1 = $location.search().param1; //Get parameter from URL

}]);

Funziona con i parametri della query e la risposta di @jeff qui sotto è per le variabili del percorso
Abdeali Chandanwala,


1
function GetURLParameter(parameter) {
        var url;
        var search;
        var parsed;
        var count;
        var loop;
        var searchPhrase;
        url = window.location.href;
        search = url.indexOf("?");
        if (search < 0) {
            return "";
        }
        searchPhrase = parameter + "=";
        parsed = url.substr(search+1).split("&");
        count = parsed.length;
        for(loop=0;loop<count;loop++) {
            if (parsed[loop].substr(0,searchPhrase.length)==searchPhrase) {
                return decodeURI(parsed[loop].substr(searchPhrase.length));
            }
        }
        return "";
    }

0

Modo semplice e facile per ottenere il valore url

First add # to url (e:g -  test.html#key=value)

url in browser (https://stackover.....king-angularjs-1-5#?brand=stackoverflow)

var url = window.location.href 

(output: url = "https://stackover.....king-angularjs-1-5#?brand=stackoverflow")

url.split('=').pop()
output "stackoverflow"

0

Quando si utilizza angularjs con express

Nel mio esempio stavo usando angularjs con express mentre eseguivo il routing, quindi usando $ routeParams avrei sbagliato con il mio routing. Ho usato il seguente codice per ottenere quello che mi aspettavo:

const getParameters = (temp, path) => {
  const parameters = {};
  const tempParts = temp.split('/');
  const pathParts = path.split('/');
  for (let i = 0; i < tempParts.length; i++) {
    const element = tempParts[i];
    if(element.startsWith(':')) {
      const key = element.substring(1,element.length);
      parameters[key] = pathParts[i];
    }
  }
  return parameters;
};

Questo riceve un modello di URL e il percorso della posizione specificata. L'ho appena chiamato con:

const params = getParameters('/:table/:id/visit/:place_id/on/:interval/something', $location.path()); 

Mettendo tutto insieme il mio controller è:

.controller('TestController', ['$scope', function($scope, $window) {
  const getParameters = (temp, path) => {
    const parameters = {};
    const tempParts = temp.split('/');
    const pathParts = path.split('/');
    for (let i = 0; i < tempParts.length; i++) {
      const element = tempParts[i];
      if(element.startsWith(':')) {
        const key = element.substring(1,element.length);
        parameters[key] = pathParts[i];
      }
    }
    return parameters;
  };

const params = getParameters('/:table/:id/visit/:place_id/on/:interval/something', $window.location.pathname);
}]);

Il risultato sarà:

{ table: "users", id: "1", place_id: "43", interval: "week" }

Spero che questo aiuti qualcuno là fuori!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.