在使用Angularjs散列后,如何解析URL参数?

时间:2014-01-02 07:30:29

标签: javascript angularjs url foursquare angularjs-routing

我正在尝试解析来自Foursquare的access_token,其URL如下:

https://mywebsite.com/4sqredirect/#access_token=1234567890XXXXX

我尝试了$ routeParams和$ location并且没有返回任何内容。只有在我尝试$ route之后,我确实得到了一个具有以下属性的对象:

current:  { 
    params:  {  } 
    pathParams:  {  } 
    loadedTemplateUrl: partials/4sqredirect
    locals:  {  } 
    scope:  { 
        this:  { 
            $ref: $["current"]["scope"]
        } 
        route:  { 
            $ref: $
        } 
        location:  {  } 
        token: null
    }
} 

这是否意味着无法使用原生的AngularJS函数来获取它的原因?

更新:

我的控制器如下所示:

angular.module('myApp')
    .controller('4sqredirectCtrl', function ($scope, $route, $location, $routeParams) {
        $scope.route = $route;
        $scope.location = $location;
        $scope.token = $routeParams.access_token;
    });

我的主要js如下所示:

angular.module('myApp', [
    'ngCookies',
    'ngResource',
    'ngSanitize',
    'ngRoute'
])
.config(function ($routeProvider, $locationProvider) {
    $locationProvider.html5Mode(true);

    $routeProvider
    .when('/', {
        templateUrl: 'partials/main',
        controller: 'MainCtrl'
    })
    .when('/4sqredirect/', {
        templateUrl: 'partials/4sqredirect',
        controller: '4sqredirectCtrl'
    })
    .otherwise({
        redirectTo: '/'
    });
});

4 个答案:

答案 0 :(得分:37)

angular location service $location.hash()方法返回#after-hash

所以,如果您的网址看起来像

https://mywebsite.com/4sqredirect/#access_token=1234567890XXXXX

然后

$location.hash()返回access_token=1234567890XXXXX

您需要将其拆分为split('=')[1]

点击4Square然后点击$location.url()返回

,查看此plunker
/4sqredirect/#access_token=123456
$location.hash().split('=')[1]

返回123456

答案 1 :(得分:8)

使用$location.search()

//e.g. url https://www.example.com/#!?name=123
var s = $location.search();
// {name: '123'}
  

http://docs.angularjs.org/api/ng。$ location

     

搜索:

     

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

答案 2 :(得分:0)

我不知道采用“本地角度”方式,但您可以通过location.hash作为字符串类型访问哈希。它可能并不理想,但它是可行的。

答案 3 :(得分:0)

事实上,Angular JS没有直接支持这样做。我不会使用ngRoute,因为它已经可能期望#位于不同的位置。解决问题的一个简单方法是使用location.hashsubstring()函数:

<!DOCTYPE html>
<html ng-app="app">

<head>
<script src="http://code.angularjs.org/1.2.6/angular.js"></script>
<link href="style.css" rel="stylesheet" />
<script>
angular.module('app', [])
.controller('AppCtrl', ['$scope', '$window', function($scope, $window) {
  $scope.accessToken = $window.location.hash.substring(14);
}]);
</script>
</head>

<body ng-controller="AppCtrl">
<h1>Access Token</h1>
<p>{{accessToken}}</p>
</body>

</html>