Як отримати параметри URL за допомогою AngularJS


199

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>

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>

Тут змінні locі тестloc1 повернення як результат для вищезазначеної URL-адреси. Це правильний шлях?


1
Ви можете перевірити $ routeParams .
Нік Хайнер

Не зрозуміло, що ви тут просите ... Документи $ routeParams та $ location # повинні почати роботу
колода

7
Будь ласка, подумайте про те, щоб додати коментар під час голосування, щоб питання можна було покращити. Дякую.
praveenpds

Відповіді:


314

Я знаю, що це давнє питання, але мені знадобилося певний час, щоб розібратися в цьому, враховуючи рідкісну кутову документацію. RouteProvider і routeParams це шлях. Маршрут з'єднує URL-адресу вашого контролера / перегляду, і routeParams можна передавати в контролер.

Ознайомтеся з проектом кутового насіння . У app.js ви знайдете приклад постачальника маршрутів. Щоб використовувати парами, просто додайте їх так:

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

Потім у свій контролер введіть $ routeParams:

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

При такому підході ви можете використовувати парами з URL-адресою, наприклад: " http://www.example.com/view1/param1/param2 "


2
Зауважте, що останнім рядком цього прикладу });має бути}]);
Ендрю Ланк

44
Також можна отримати інші довільні параметри у формі рядка запиту /view/1/2?other=12з $routeParams.other
DavidC

Я думаю, що у вашому контролері повторився 'var param1'. Я не зміг змінити таку просту зміну.
Том

Кутовий зробити це так просто, а також ваша відповідь настільки приємна описова
Мохаммед Кермані

1
Призначте та надішліть приклад: var param1 = "abc"; $ location.path ('/ view1 /:' + param1); $ route.reload ();
Robot70

158

Хоча маршрутизація справді є хорошим рішенням для розбору URL-адрес на рівні додатків, можливо, ви захочете скористатися послугою більш низького рівня $location, введеною у вашу службу чи контролер:

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

Цей простий синтаксис буде працювати для http://example.com/path?myParam=paramValue. Однак, лише якщо ви раніше налаштовували $locationProviderв режимі HTML 5:

$locationProvider.html5Mode(true);

В іншому випадку подивіться на http://example.com/#!/path?myParam=someValue синтаксис "Hashbang", який є трохи складнішим, але матиме перевагу працювати над старими браузерами (не сумісні з HTML 5) як Ну.


16
здається, вам потрібно додати $ locationProvider.html5mode (true) як конфігурацію модуля, наприклад: angular.module ("myApp", []). config (функція ($ locationProvider) {$ locationProvider.html5Mode (true);});
sq1020

4
І html5Mode вимагає <base href="http://example.com/en/" />тег у вашому index.html.
cespon

1
Що мені подобається у вашому рішенні, це те, що ви можете навіть передавати об’єкти, і ви отримуєте їх як об’єкти.
Шилан

2
Також можна не додати тег <base> і вказати його так:.config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }); }])
Гійом

1
У Angular 1.5.8 мені не довелося конфігурувати $locationProvider, щоб це працювало. http://example.com/path#?someKey=someVal, потім $location.search().someKey // => 'someVal'
jiminikiz

32

Якщо ви використовуєте ngRoute, ви можете ввести його $routeParamsв свій контролер

http://docs.angularjs.org/api/ngRoute/service/$routeParams

Якщо ви використовуєте angular-ui-router, ви можете ввести його $stateParams

https://github.com/angular-ui/ui-router/wiki/URL-Routing


1
Щоб $stateParamsпоказати параметри запиту, мені довелося вказати їх під час визначення станів, як показано на github.com/angular-ui/ui-router/wiki/…
Parziphal

11

Я знайшов рішення, як використовувати $ location.search (), щоб отримати параметр з URL

спочатку в URL u потрібно поставити синтаксис "#" перед таким параметром, як цей приклад

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

а потім у свій контролер u покладіть функцію $ location і використовуйте $ location.search (), щоб отримати параметр URL для

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

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

}]);

Він працює для параметрів запиту, і наведена нижче відповідь @jeff призначена для змінних шляхів
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

Простий та елістичний спосіб отримати значення 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

При використанні angularjs з експресом

На моєму прикладі я використовував angularjs з експресом, роблячи маршрутизацію, тому використання $ routeParams зіпсується з моєю маршрутизацією. Я використовував наступний код, щоб отримати те, що я очікував:

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

Це отримує шаблон URL-адреси та шлях даного місцезнаходження. Я просто називаю це:

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

Збираючи все це разом мій контролер:

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

Результатом буде:

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

Сподіваюся, це допомагає комусь там!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.