Удалите хэш Facebook OAuth с помощью Angular JS
Facebook любит добавлять #_=_
в конце URL обратного вызова OAuth мы даем его. Хотя мы не используем навигацию на основе хеша, она выглядит раздражающей, и я бы хотел избавиться от нее.
location.hash = '';
вызывает бесконечный цикл в $watch
(это также происходит с $window.location.hash = '';
). Угловой способ $location.hash('');
ничего не меняет. $location.path('');
дает нам часть пути туда, в результате чего /#/
добавляется к нашему URL.
Я также играл с $locationProvider.html5Mode
и получил только ошибки. (Error: [$injector:unpr] Unknown provider: $locationProviderProvider <- $locationProvider
) хотя это может быть моя вина.
Как я могу удалить хэш OAuth без ошибок?
5 ответов
Как начать поиск недвижимости ? свойство hash должно начинаться с #.
Вместо установки location.hash равной пустой строке, установите его в "#".
location.hash = '#';
PS
Вы можете получить голоса из-за этого
Хотя мы не используем навигацию на основе хеша, она выглядит раздражающей, и я бы хотел избавиться от нее.
Хотя у меня нет никаких сомнений по этому поводу, вопрос - это вопрос, независимо от причины, некоторые могут счесть это пустой тратой времени, поскольку единственная видимая причина в том, что вы находите его раздражающим.
У меня нет опыта работы с FB, но мы довольно много обрабатываем URL-адреса с использованием http- перехватчиков Angular. Вы можете реализовать простую замену регулярных выражений для входящих данных следующим образом (адаптировано из документов):
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
'response': function(response) {
// alter the response
var loc = response.headers.location;
response.headers.location = loc.replace(/#_=_$/,'');
// pass along the altered response
return response;
}
};
});
$httpProvider.interceptors.push('myHttpInterceptor');
Это идет в .config
модуль вашего углового приложения. Он будет работать прозрачно при ВСЕХ запросах через службу $ http, поэтому вы можете захотеть выполнить дополнительную обработку, если вам нужно оставить некоторые URL-адреса в покое.
Я предполагаю, что вы говорите о https://www.facebook.com/dialog/oauth?client_id=...&redirect_uri=... вызове OAuth. В своем коде я предоставляю им URI в кодировке URI, который уже содержит хэш, такой как myserver.com/myapp/#/login/facebook, поэтому их перенаправление будет обрабатываться в AngularJS $routeProvider моего приложения. Как ни странно, Facebook добавляет хэш к пути после пути, так что моя конфигурация $ routeProvider выглядит следующим образом
myApp.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/login/facebook', {
templateUrl: 'dialogs/login/facebook.html',
controller: 'LoginFacebookCtrl'
}).
when('/login/facebook&', { // Facebook seems to attach an & at the end
templateUrl: 'dialogs/login/facebook.html',
controller: 'LoginFacebookCtrl'
})
...
}]);
Работает для меня.
Попробуйте добавить перенаправление, если оно будет подходящим для вас:
app.config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/_=_', { redirectTo: '/' });
}]);
Кажется, что угловые изменения #_=_
в #/_=_
так что мы можем сбросить его с $location.path('/')
,
Это приведет к /#/
это обычный hashbang, который мы можем отключить с помощью режима html5.
myApp.config(['$locationProvider',
function ($locationProvider) {
$locationProvider.html5Mode(true);
}]);
Вам нужно будет добавить <base href="/">
тег под <head>
раздел в соответствии с его док.