Cách nhận thông số url bằng AngularJS


199

Mã nguồn 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>

Mã nguồn 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>

Ở đây các biến locloc1cả hai trả về kiểm tra là kết quả cho URL ở trên. Đây có phải là cách chính xác?


1
Bạn có thể muốn kiểm tra $ routeParams .
Nick Heiner

Không rõ những gì bạn đang hỏi ở đây ... các tài liệu phương thức $ routeParams và $ location # sẽ giúp bạn bắt đầu
boong

7
Vui lòng xem xét thêm một bình luận khi bỏ phiếu xuống để câu hỏi có thể được cải thiện. Cảm ơn.
Praveenpds

Câu trả lời:


314

Tôi biết đây là một câu hỏi cũ, nhưng tôi phải mất một thời gian để sắp xếp câu hỏi này với tài liệu Angular thưa thớt. Các RouteProviderrouteParams là con đường để đi. Tuyến kết nối URL tới Trình điều khiển / Chế độ xem của bạn và tuyến đường có thể được chuyển vào bộ điều khiển.

Kiểm tra dự án hạt giống Angular . Trong app.js, bạn sẽ tìm thấy một ví dụ cho nhà cung cấp tuyến đường. Để sử dụng params chỉ cần nối chúng như thế này:

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

Sau đó, trong bộ điều khiển của bạn tiêm $ routeParams:

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

Với phương pháp này, bạn có thể sử dụng thông số có url như: " http://www.example.com/view1/param1/param2 "


2
Lưu ý rằng dòng cuối cùng của ví dụ này });phải là}]);
Andrew Lank

44
Cũng có thể nhận các thông số tùy ý khác ở dạng chuỗi truy vấn /view/1/2?other=12với $routeParams.other
DavidC

Tôi nghĩ rằng bạn có 'var param1' được lặp lại trong bộ điều khiển của bạn. Tôi không thể chỉnh sửa một thay đổi đơn giản như vậy.
Tom

Angular làm cho nó rất dễ dàng, và câu trả lời của bạn rất hay mô tả
Mohammad Kermani

1
Gán và gửi ví dụ: var param1 = "abc"; $ location.path ('/ view1 /:' + param1); $ route.reload ();
Robot70

158

Mặc dù định tuyến thực sự là một giải pháp tốt để phân tích cú pháp URL cấp ứng dụng, bạn có thể muốn sử dụng $locationdịch vụ cấp thấp hơn , như được đưa vào dịch vụ hoặc bộ điều khiển của riêng bạn:

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

Cú pháp đơn giản này sẽ làm việc cho http://example.com/path?myParam=paramValue. Tuy nhiên, chỉ khi bạn định cấu hình $locationProviderở chế độ HTML 5 trước:

$locationProvider.html5Mode(true);

Nếu không có một cái nhìn tại http://example.com/#!/path?myParam=someValue "Hashbang" cú pháp đó là phức tạp hơn một chút, nhưng có lợi ích của làm việc trên các trình duyệt cũ (không phải là HTML 5 tương thích) như tốt.


16
có vẻ như bạn phải thêm $ locationProvider.html5mode (true) dưới dạng cấu hình mô-đun như vậy: angular.module ("myApp", []). cấu hình (hàm ($ locationProvider) {$ locationProvider.html5Mode (true);});
sq1020

4
Và html5Mode yêu cầu một <base href="http://example.com/en/" />thẻ trong của bạn index.html.
cespon

1
Điều tôi thích về giải pháp của bạn là bạn thậm chí có thể vượt qua các đối tượng và bạn lấy chúng làm đối tượng.
Shilan

2
Cũng có thể không thêm thẻ <base> và chỉ định nó như thế này:.config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }); }])
Guillaume

1
Trong Angular 1.5.8, tôi không phải cấu hình $locationProviderđể nó hoạt động. http://example.com/path#?someKey=someVal, sau đó $location.search().someKey // => 'someVal'
jiminikiz

32

Nếu bạn đang sử dụng ngRoute, bạn có thể đưa $routeParamsvào bộ điều khiển của mình

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

Nếu bạn đang sử dụng bộ định tuyến góc, bạn có thể tiêm $stateParams

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


1
Để $stateParamshiển thị các tham số truy vấn, tôi phải chỉ định chúng khi xác định trạng thái, như được hiển thị trong github.com/angular-ui/ui-router/wiki/
Kẻ

11

Tôi đã tìm giải pháp cách sử dụng $ location.search () để lấy tham số từ URL

đầu tiên trong URL bạn cần đặt cú pháp "#" trước tham số như ví dụ này

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

và sau đó trong bộ điều khiển của bạn, bạn đặt $ location vào hàm và sử dụng $ location.search () để lấy tham số URL cho

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

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

}]);

Nó hoạt động cho các tham số truy vấn và câu trả lời dưới đây của @jeff dành cho các biến đường dẫn
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

Cách đơn giản và dễ dàng để có được giá trị 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

Khi sử dụng angularjs với express

Trong ví dụ của tôi, tôi đã sử dụng angularjs với express thực hiện định tuyến, vì vậy sử dụng $ routeParams sẽ gây rối với định tuyến của tôi. Tôi đã sử dụng mã sau đây để có được những gì tôi đang mong đợi:

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

Điều này nhận được một mẫu URL và đường dẫn của vị trí đã cho. Tôi chỉ gọi nó bằng:

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

Đặt tất cả lại với nhau bộ điều khiển của tôi là:

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

Kết quả sẽ là:

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

Hy vọng điều này sẽ giúp ai đó ngoài kia!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.