Comment obtenir les paramètres d'URL en utilisant AngularJS


199

Code source 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>

Code source 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>

Ici, les variables locet les loc1deux renvoient test comme résultat pour l'URL ci-dessus. C'est la bonne route?


1
Vous voudrez peut-être consulter $ routeParams .
Nick Heiner

Ce que vous demandez ici n'est pas clair ... les documents $ routeParams et $ location # methods devraient vous aider à démarrer
deck

7
Veuillez envisager d'ajouter un commentaire lors du vote pour que la question puisse être améliorée. Merci.
praveenpds

Réponses:


314

Je sais que c'est une vieille question, mais il m'a fallu un certain temps pour résoudre ce problème étant donné la documentation angulaire clairsemée. Le RouteProvider et routeParams est le chemin à parcourir. L'itinéraire relie l'URL à votre Controller / View et les routeParams peuvent être transmis au contrôleur.

Découvrez le projet de semences angulaires . Dans app.js, vous trouverez un exemple pour le fournisseur d'itinéraire. Pour utiliser des paramètres, ajoutez-les simplement comme ceci:

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

Ensuite, dans votre contrôleur, injectez $ routeParams:

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

Avec cette approche, vous pouvez utiliser des paramètres avec une URL telle que: " http://www.example.com/view1/param1/param2 "


2
Notez que la dernière ligne de cet exemple });devrait être}]);
Andrew Lank

44
Peut également obtenir d'autres paramètres arbitraires sous la forme d'une chaîne de requête /view/1/2?other=12avec $routeParams.other
DavidC

Je pense que vous avez répété le «var param1» dans votre contrôleur. Je n'ai pas pu modifier un changement aussi simple.
Tom

Angular rend les choses si faciles, et aussi votre réponse est tellement agréable
Mohammad Kermani

1
Exemple d'affectation et d'envoi: var param1 = "abc"; $ location.path ('/ view1 /:' + param1); $ route.reload ();
Robot70

158

Bien que le routage soit en effet une bonne solution pour l'analyse d'URL au niveau de l'application, vous souhaiterez peut-être utiliser le service de plus bas niveau $location, tel qu'il est injecté dans votre propre service ou contrôleur:

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

Cette syntaxe simple fonctionnera pour http://example.com/path?myParam=paramValue. Cependant, uniquement si vous avez configuré le $locationProviderdans le mode HTML 5 avant:

$locationProvider.html5Mode(true);

Sinon, jetez un œil à la syntaxe http://example.com/#!/path?myParam=someValue "Hashbang" qui est un peu plus compliquée, mais qui a l'avantage de fonctionner sur d'anciens navigateurs (non compatibles HTML 5) comme bien.


16
il semble que vous devez ajouter $ locationProvider.html5mode (true) en tant que module de configuration comme ceci: angular.module ("myApp", []). config (function ($ locationProvider) {$ locationProvider.html5Mode (true);});
sq1020

4
Et html5Mode nécessite une <base href="http://example.com/en/" />balise dans votre index.html.
cespon

1
ce que j'aime dans votre solution, c'est que vous pouvez même passer des objets, et vous les obtenez comme objet.
Shilan

2
Il est également possible de ne pas ajouter la balise <base> et de la spécifier comme ceci:.config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }); }])
Guillaume

1
Dans Angular 1.5.8, je n'avais pas besoin de configurer $locationProviderpour que cela fonctionne. http://example.com/path#?someKey=someVal, puis $location.search().someKey // => 'someVal'
jiminikiz


11

J'ai trouvé une solution pour utiliser $ location.search () pour obtenir le paramètre de l'URL

d'abord dans l'URL, vous devez mettre la syntaxe "#" avant le paramètre comme cet exemple

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

puis dans votre contrôleur, mettez $ location dans la fonction et utilisez $ location.search () pour obtenir le paramètre URL pour

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

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

}]);

Ses travaux pour les paramètres de requête et la réponse ci-dessous de @jeff sont pour les variables de chemin
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

Un moyen simple et plus facile d'obtenir la valeur de l'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

Lorsque vous utilisez angularjs avec express

Sur mon exemple, j'utilisais angularjs avec express faisant le routage, donc l'utilisation de $ routeParams gâcherait mon routage. J'ai utilisé le code suivant pour obtenir ce que j'attendais:

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;
};

Celui-ci reçoit un modèle d'URL et le chemin de l'emplacement donné. Je l'appelle avec:

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

Assembler tout cela mon contrôleur est:

.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);
}]);

Le résultat sera:

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

J'espère que cela aide quelqu'un là-bas!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.