使用AngularJS $ location从URL中获取查询字符串中的值

Ian*_*ton 94 javascript angularjs

关于$ location.search,文档说,

在没有任何参数的情况下调用时返回当前url的搜索部分(作为对象).

在我的网址中,我的查询字符串有一个没有值的参数'?test_user_bLzgB'.'$ location.search()'也返回一个对象.我如何获得实际文本?

The*_*One 149

不确定自接受的答案被接受后它是否已经改变,但是有可能.

$location.search()将返回键值对的对象,与查询字符串相同的对.没有值的键只是作为true存储在对象中.在这种情况下,对象将是:

{"test_user_bLzgB": true}
Run Code Online (Sandbox Code Playgroud)

您可以直接访问此值 $location.search().test_user_bLzgB

示例(具有较大的查询字符串):http://fiddle.jshell.net/TheSharpieOne/yHv2p/4/show/?test_user_bLzgB&somethingElse&tooso&something = Somethingelse

注意:由于哈希(因为它会转到http://fiddle.jshell.net/#/url,这将创建一个新的小提琴),这个小提琴将不适用于不支持js历史的浏览器(将无法正常工作)在IE <10)

编辑:
正如@Naresh和@DavidTchepak的评论所指出的,$locationProvider还需要正确配置:https://code.angularjs.org/1.2.23/docs/guide/$location#-location-service-configuration

  • 这只适用于html5enabled为true :( (10认同)
  • 正如Naresh所说,`$ locationProvider`也需要正确配置:https://code.angularjs.org/1.2.23/docs/guide/$location#-location-service-configuration(这让我失望了.希望是链接节省了一些时间.) (3认同)
  • 要配置位置提供程序,您需要:window.app.config ['$ locationProvider',($ locationProvider) - > $ locationProvider.html5Mode true]您还需要HTML文件中的基本标记:<base href ="/"> (2认同)

and*_*rsh 48

如果您只需要将查询字符串视为文本,则可以使用: $window.location.search

  • 这怎么不是答案?也许它有点短,但它似乎回答了这个问题. (11认同)

ale*_*tti 38

$location.search()返回一个对象,由键作为变量,值作为其值.所以:如果你写这样的查询字符串:

?user=test_user_bLzgB
Run Code Online (Sandbox Code Playgroud)

你可以很容易地得到这样的文字:

$location.search().user
Run Code Online (Sandbox Code Playgroud)

如果你不想使用密钥,值如?foo = bar,我建议使用散列#test_user_bLzgB,

并打电话

$location.hash()
Run Code Online (Sandbox Code Playgroud)

将返回'test_user_bLzgB',这是您要检索的数据.

附加信息:

如果您使用了查询字符串方法并且获得了一个带有$ location.search()的空对象,那么可能是因为Angular正在使用hashbang策略而不是html5策略...要使其正常工作,请将此配置添加到您的模

yourModule.config(['$locationProvider', function($locationProvider){
    $locationProvider.html5Mode(true);    
}]);
Run Code Online (Sandbox Code Playgroud)


Mas*_*man 13

首先使URL格式正确以获取查询字符串#?q = string对我有用

http://localhost/codeschool/index.php#?foo=abcd
Run Code Online (Sandbox Code Playgroud)

将$ location服务注入控制器

app.controller('MyController', [ '$location', function($location) { 

    var searchObject = $location.search();

    // $location.search(); reutrn object 
    // searchObject = { foo = 'abcd' };

    alert( searchObject.foo );

} ]);
Run Code Online (Sandbox Code Playgroud)

所以输出应该是abcd


Rol*_*n C 10

你也可以使用它

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

var queryValue = getParameterByName('test_user_bLzgB');
Run Code Online (Sandbox Code Playgroud)

  • 您已经从另一个SOF答案中复制了该功能...最好参考您的来源. (3认同)

Mah*_*esh 10

如果您$location.search()的工作不正常,请确保您拥有以下内容:

1)html5Mode(true)在app的模块配置中配置

appModule.config(['$locationProvider', function($locationProvider) {
   $locationProvider.html5Mode(true);
}]);
Run Code Online (Sandbox Code Playgroud)

2)<base href="/">存在于您的HTML中

<head>
  <base href="/">
  ...
</head>
Run Code Online (Sandbox Code Playgroud)

参考文献:

  1. base href ="/"
  2. html5Mode


rew*_*ten 7

Angular不支持这种查询字符串.

URL的查询部分应该是一个&分离的键值对序列,因此可以完美地解释为一个对象.

根本没有API来管理不代表键值对集的查询字符串.