【问题标题】:How to get the url parameters using AngularJS如何使用 AngularJS 获取 url 参数
【发布时间】:2012-08-01 11:17:27
【问题描述】:

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>

这里的变量 locloc1 都返回 test 作为上述 URL 的结果。这是正确的方法吗?

【问题讨论】:

  • 您可能想查看$routeParams
  • 不清楚你在这里问什么...... $routeParams 和 $location#methods 文档应该让你开始
  • 请考虑在投反对票时添加评论,以便改进问题。谢谢。

标签: javascript angularjs routeparams


【解决方案1】:

我知道这是一个老问题,但鉴于 Angular 文档稀疏,我花了一些时间来解决这个问题。 RouteProviderrouteParams 是要走的路。路由将 URL 连接到您的 Controller/View,并且 routeParams 可以传递到控制器中。

查看Angular seed 项目。在 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"

【讨论】:

  • 注意这个例子的最后一行});应该是}]);
  • 也可以通过/view/1/2?other=12$routeParams.other获取查询字符串形式的其他任意参数
  • 我认为您的控制器中重复了“var param1”。我无法编辑这么简单的更改。
  • Angular 让它变得如此简单,而且你的回答也很好描述
  • 分配和发送示例:var param1 = "abc"; $location.path('/view1/:' + param1);$route.reload();
【解决方案2】:

虽然路由确实是应用程序级 URL 解析的一个很好的解决方案,但您可能希望使用更底层的 $location 服务,就像注入到您自己的服务或控制器中一样:

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

这个简单的语法适用于http://example.com/path?myParam=paramValue。但是,前提是您之前在 HTML 5 模式下配置了$locationProvider

$locationProvider.html5Mode(true);

否则,请查看 http://example.com/#!/path?myParam=someValue"Hashbang" 语法,它有点复杂,但也可以在旧浏览器(不兼容 HTML 5)上工作。

【讨论】:

  • 您似乎必须将 $locationProvider.html5mode(true) 添加为模块配置,如下所示:angular.module("myApp", [])。配置(函数($locationProvider){ $locationProvider.html5Mode(true); });
  • 而 html5Mode 需要在您的 index.html 中添加一个 &lt;base href="http://example.com/en/" /&gt; 标记。
  • 我喜欢您的解决方案的一点是,您甚至可以传递对象,然后将它们作为对象获取。
  • 也可以不加标签,这样指定:.config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }); }])
  • 在 Angular 1.5.8 中,我无需配置 $locationProvider 即可使其工作。 http://example.com/path#?someKey=someVal,然后是$location.search().someKey // =&gt; 'someVal'
【解决方案3】:

如果您使用的是 ngRoute,您可以将 $routeParams 注入到您的控制器中

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

如果你使用 angular-ui-router,你可以注入 $stateParams

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

【讨论】:

【解决方案4】:

我找到了如何使用 $location.search() 从 URL 获取参数的解决方案

首先在 URL 中你需要在这个例子的参数之前加上语法“#”

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

然后在您的控制器中,您将 $location 放入函数中并使用 $location.search() 获取 URL 参数

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

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

}]);

【讨论】:

  • 它适用于查询参数,@jeff 的以下答案适用于路径变量
【解决方案5】:

如果已经发布的答案没有帮助,可以尝试 $location.search().myParam; 带有网址http://example.domain#?myParam=paramValue

【讨论】:

【解决方案6】:
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 "";
    }

【讨论】:

  • window.location.href 实际上是我需要的。并不总是需要一些花哨的 Angular 解决方案。这对我来说是个窍门。
【解决方案7】:

获取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"

【讨论】:

    【解决方案8】:

    将 angularjs 与 express 一起使用时

    在我的示例中,我使用 angularjs 和 express 进行路由,因此使用 $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" }
    

    希望这对那里的人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多