在AngularJS中读取查询参数最简洁的方法是什么?
我想阅读使用AngularJS的URL查询参数的值。 我使用以下URL访问HTML:
http://127.0.0.1:8080/test.html?target=bob
正如所料, location.search
是"?target=bob"
。 为了访问目标的价值,我发现了网上列出的各种例子,但没有一个在AngularJS 1.0.0rc10中工作。 具体而言,以下全部undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
任何人都知道什么会工作? (我使用$location
作为我的控制器的参数)
更新:
我已经在下面发布了一个解决方案,但我并不完全满意它。 开发人员指南中的文档:Angular Services:使用$ location指出以下有关$location
:
我应该何时使用$ location?
任何时候您的应用程序需要对当前URL中的更改做出反应,或者您想要更改浏览器中的当前URL。
对于我的场景,我的页面将从具有查询参数的外部网页打开,所以我不是“对当前URL中的更改作出反应”。 所以也许$location
不适合工作(对于丑陋的细节,请参阅下面的答案)。 因此,我将这个问题的标题从“如何使用$ location读取AngularJS中的查询参数?”更改为 到“在AngularJS中读取查询参数的最简洁的方式是什么?”。 很明显,我可以使用JavaScript和正则表达式来解析location.search
,但是对于基本的东西来说这样低级的确会冒犯我的程序员的敏感性。
所以:有没有比使用$location
更好的方法来使用$location
,还是有一个简洁的替代方案?
您可以将$ routeParams(需要ngRoute)注入到控制器中。 以下是文档中的一个示例:
// Given:
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
// Route: /Chapter/:chapterId/Section/:sectionId
//
// Then
$routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
编辑:你也可以用$ location服务获取和设置查询参数(可用ng
),特别是它的search
方法:$ location.search()。
$ routeParams在控制器的初始加载后不太有用; $location.search()
可以随时调用。
很好,你已经设法使用html5模式,但它也可以使它在hashbang模式下工作。
你可以简单地使用:
$location.search().target
访问“目标”搜索参数。
作为参考,这里是工作jsFiddle:http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
var myApp = angular.module('myApp', []);
function MyCtrl($scope, $location) {
$scope.location = $location;
$scope.$watch('location.search()', function() {
$scope.target = ($location.search()).target;
}, true);
$scope.changeTarget = function(name) {
$location.search('target', name);
}
}
<div ng-controller="MyCtrl">
<a href="#!/test/?target=Bob">Bob</a>
<a href="#!/test/?target=Paul">Paul</a>
<hr/>
URL 'target' param getter: {{target}}<br>
Full url: {{location.absUrl()}}
<hr/>
<button ng-click="changeTarget('Pawel')">target=Pawel</button>
</div>
要给出我自己的问题的部分答案,下面是HTML5浏览器的工作示例:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="http://code.angularjs.org/1.0.0rc10/angular-1.0.0rc10.js"></script>
<script>
angular.module('myApp', [], function($locationProvider) {
$locationProvider.html5Mode(true);
});
function QueryCntl($scope, $location) {
$scope.target = $location.search()['target'];
}
</script>
</head>
<body ng-controller="QueryCntl">
Target: {{target}}<br/>
</body>
</html>
关键是调用$locationProvider.html5Mode(true);
如上所述。 它现在可以在打开http://127.0.0.1:8080/test.html?target=bob
。 我不喜欢它在旧版浏览器中无法使用的事实,但我仍然可以使用这种方法。
一种可以在旧版浏览器中使用的替代方法是删除html5mode(true)
调用,并使用以下地址和hash +斜杠代替:
http://127.0.0.1:8080/test.html#/?target=bob
相关文档位于开发者指南:Angular Services:使用$ location(很奇怪我的谷歌搜索没有找到...)。
链接地址: http://www.djcxy.com/p/89963.html上一篇: What's the most concise way to read query parameters in AngularJS?