Ответ 1
Вы можете добавить эту функцию разрешения в свое состояние, которое заменит хеш-url на строку запроса url:
resolve: {
'urlFix': ['$location', function($location){
$location.url($location.url().replace("#","?"));
}]
}
- Таким образом, URL-адрес
/fbauth#access_token=123456&code=abcde&expires_in=99999999
будет перенаправлен автоматически - Стать
/fbauth?access_token=123456&code=abcde&expires_in=99999999
-
$stateParams
будет заполнено правильно. - Значение будет
{access_token: "123456", code: "abcde", expires_in: "99999999"}
-
$location.url()
не обновляется, если местоположение уже совпадает, поэтому состояние не будет перенаправляться, если нет#
.
Полный код примера:
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script>
<meta charset="utf-8">
<title>FBAUTH</title>
</head>
<body ng-app="app">
<base href="/">
<div ui-view></div>
<script>
angular.module('app', ['ui.router'])
.controller('publicCtrl', ['$scope','$stateParams', function($scope, $stateParams) {
// $stateParams should be correctly set (even for hash route)
console.log($stateParams);
}])
.config(['$locationProvider','$stateProvider', function($locationProvider, $stateProvider){
$stateProvider
.state("fbauth",
{
url: '/fbauth?access_token&code&expires_in',
templateUrl: 'fbauth.html',
controller: 'publicCtrl',
resolve: {
'urlFix': ['$location', function($location){
$location.url($location.url().replace("#","?"));
}]
}
});
$locationProvider.html5Mode(true);
}]);
</script>
</body>
</html>