在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?

    下一篇: Pinch to zoom/scale just iframe in Cordova app