AngularJS: Как очистить параметры запроса в URL?


135

Мое приложение AngularJS должно иметь доступ к профилю пользователя LinkedIn. Чтобы сделать это, мне нужно перенаправить пользователя на URL-адрес LinkedIn, который содержит параметр обратного вызова redirect_uri, который сообщит LinkedIn о перенаправлении пользователя обратно в мое веб-приложение и включит в URL параметр запроса «code». Это традиционный поток Oauth 2.0.

Все отлично работает, за исключением того, что LinkedIn перенаправляет пользователя обратно на следующий URL:

http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites

Я хотел бы удалить ?code=XXX&state=YYYиз URL, чтобы сделать его чистым. Пользователю не нужно видеть параметры запроса, которые я получил от перенаправления LinkedIn.

Я пытался $location.absUrl($location.path() + $location.hash()).replace(), но он сохраняет параметры запроса в URL.

Я также не могу извлечь параметры запроса, например, «код», используя ($location.search()).code. Кажется, что есть? перед # в указанном выше URL обманывает Angular.

Ответы:


151

я использую

$location.search('key', null)

Поскольку это не только удаляет мой ключ, но и удаляет его из видимости на URL.


2
это вызывает цикл кнопки возврата в chrome, так как кнопка возврата возвращается к //example.com?key=value, но наклоняется вперед к //example.com. Предложения?
Джейбро

2
Это звучит как проблема с кодом для меня. Angular не должен ничего пересылать, если только вы не добавили какой-то метод. Кроме того, добавление .replace () заменяет текущую запись истории.
Юлий

viewModelHelper.navigateTo ( 'Foo /'); сохранял строку запроса в URL-адресе foo, поэтому я исправил ее с помощью window.location.href = 'foo /'; вместо.
Джейбро

2
Не используйте window, вместо этого используйте $ window Angular. Это будет проще для модульного тестирования. Больше: docs.angularjs.org/api/ng/service/$window
Юлий

Это прекрасно работает, если вы хотите удалить конкретный параметр, спасибо.
Dexxo

107

Я получил ответ на форуме AngularJS. Смотрите эту тему для деталей


Ссылка на ветку групп Google, которая трудна для чтения и не дает четкого ответа. Для удаления параметров URL используйте

$location.url($location.path());

Я думаю, что вы хотели поместить путь в $ location.url () вместо $ location.path. Попытка объединить их обоих, как описано выше, не работает для меня.
mbdev

1
у меня тоже не работает. Обе функции оставляют здесь параметр запроса.
Пабло Эзекьель Леоне

действительно полезный ответ. В моем сценарии каждый раз после первого запуска $ location.path ('/ reportmaint'). Search ({<myparams>}) он никогда не очищал предыдущие параметры запроса.
bob.mazzo

это вызывает цикл кнопки возврата в chrome, так как кнопка возврата возвращается к //example.com?key=value, но наклоняется вперед к //example.com. Предложения?
Джейбро

+1 заThe link is to a Google Groups thread, which is difficult to read and doesn't provide a clear answer
Влад

70

Чтобы удалить ВСЕ параметры запроса, выполните:

$location.search({});

Чтобы удалить ОДИН конкретный параметр запроса, выполните:

$location.search('myQueryParam', null);

2
Работает и для Angular 1.5.
Маниш М Демблани

1
также работает undefined, если вы избегаете использовать, nullкак я.
HankScorpio

Что мне не нравится, так это то, что если вы вернетесь назад с помощью кнопки «Назад» в браузере, вы потеряете поисковый запрос, который я делал ранее на моей предыдущей странице поиска.
Gino

@ Джино В качестве обходного пути, вы можете добавить запись в историю браузера перед этим сбросом. stackoverflow.com/q/10541388/586051
Рахул Десаи

@RahulDesai Я использую ng-route, но мне не
Gino

29

Чтобы очистить элемент, удалите его и вызовите $$ compose

    if ($location.$$search.yourKey) {
        delete $location.$$search.yourKey;
        $location.$$compose();
    }

получено из источника angularjs: https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443


2
блестящий! Работал как шарм.
Полкпедерсон

Это сработало для меня, но я бы предположил, что решение Юлиуса является более правильным, так как, похоже, именно это имели в виду ребята из Angular, когда создавали searchметод. docs.angularjs.org/api/ng/service/$location#search
zmilojko

1
Спасибо, это сработало довольно хорошо ... Интересно, что IE8 любит устанавливать / составлять этот URL, а затем загружать его впоследствии. Я уверен, что именно поэтому правильная маршрутизация предпочтительнее, а также почему мы все плохие люди. : P
Романул

27

Вы можете удалить определенный параметр запроса, используя:

delete $location.$$search.nameOfParameter;

Или вы можете очистить все параметры запроса, установив поиск для пустого объекта:

$location.$$search = {};

2
Я не знаю почему, но это решение не работает при переключении страниц (параметры могут появиться снова, даже если они $location.$$search = {}выполнены). Решение @basarat работает хорошо.
Mik378

1
Сработало у меня нормально - может быть, проверьте последовательность, в которой вы удаляете параметр и меняете путь?
Деманьяк

1
Хотя это может сработать, оно получает доступ к закрытым переменным, которые не следует изменять, см. Ответ @Julius для другого решения
Бен Талиадорос

26

На момент написания, как ранее упоминалось @Bosh, html5modeдолжно быть true, чтобы можно было установить $location.search()и отразить его обратно в визуальный URL окна.

См. Https://github.com/angular/angular.js/issues/1521 для получения дополнительной информации.

Но если html5mode этоtrue вы можете легко очистить строку запроса URL - адрес с:

$location.search('');

или

$location.search({});

Это также изменит визуальный URL окна.

(Проверено в версии AngularJS 1.3.0-rc.1с html5Mode(true).)


12

Нужно заставить его работать когда html5mode= false?

Все остальные ответы работают только тогда , когда Угловая - х html5modeэто true. Если вы работаете вне html5mode, то $locationотносится только к «поддельному» местоположению, которое находится в вашем хэше - и поэтому $location.searchне может видеть / редактировать / исправлять параметры поиска реальной страницы.

Вот обходной путь, который нужно вставить в HTML-код страницы перед угловой нагрузкой:

<script>
  if (window.location.search.match("code=")){
    var newHash = "/after-auth" + window.location.search;
    if (window.history.replaceState){
      window.history.replaceState( {}, "", window.location.toString().replace(window.location.search, ""));
    }
    window.location.hash = newHash;
  }
</script>

2
Еще один способ избежать настройки html5Mode на true - создать строку запроса так, чтобы она содержала # прямо перед ? , так что myapp/#?client=clientName вместо myapp/?client=clientName
Ангел Гао


4

Если вы хотите перейти на другой URL и очистить параметры запроса, просто используйте:

$location.path('/my/path').search({});

1

Если вы используете параметры маршрутов, просто очистите $ routeParams

$routeParams= null;

1
Это просто установит локальную переменную $routeParamsв null. На самом деле не влияет на параметры URL в адресной строке.
Эрик Ф.

1

Как насчет установки хэша местоположения в нуль

$location.hash(null);

0

если вы немедленно обработаете параметры и затем перейдете на следующую страницу, вы можете поставить знак вопроса в конце нового местоположения.

например, если бы вы сделали $ location.path ('/ nextPage');

вместо этого вы можете сделать это: $ location.path ('/ nextPage?');


0

Я попробовал вышеуказанные ответы, но не смог заставить их работать. Единственный код, который работал для меня, был$window.location.search = ''


0

Я могу заменить все параметры запроса одной строкой: $location.search({});
простой для понимания и простой способ их очистки.


0

Принятый ответ сработал для меня, но мне нужно было покопаться немного глубже, чтобы исправить проблемы с кнопкой возврата.

Что я заметил, так это то, что если я ссылаюсь на страницу с помощью <a ui-sref="page({x: 1})">, а затем удаляю строку запроса с помощью $location.search('x', null), я не получаю дополнительной записи в истории браузера, поэтому кнопка «Назад» возвращает меня туда, откуда я начал. Хотя я чувствую, что это неправильно, потому что я не думаю, что Angular должен автоматически удалить эту запись истории для меня, это фактически желаемое поведение для моего конкретного варианта использования.

Проблема заключается в том, что если я ссылку на страницу , используя <a href="https://stackoverflow.com/page/?x=1">вместо этого, затем удалить строку запроса таким же образом, я сделать получить дополнительную запись в моей истории браузера, так что я должен нажать на кнопку назад дважды , чтобы вернуться туда , где я начал , Это противоречивое поведение, но на самом деле это кажется более правильным.

Я легко могу решить проблему со hrefссылками с помощью $location.search('x', null).replace(), но тогда это ломает страницу, когда вы заходите на нее по ui-srefссылке, так что это не хорошо.

После долгих раздумий я решил эту проблему:

В функции моего приложения runя добавил это:

$rootScope.$on('$locationChangeSuccess', function () {
    $rootScope.locationPath = $location.path();
});

Затем я использую этот код для удаления параметра строки запроса:

$location.search('x', null);

if ($location.path() === $rootScope.locationPath) {
    $location.replace();
}

0

Для Angular> 2 , вы можете передать null всем параметрам, которые хотите очистить

this.router.navigate(['/yourRoute'], {queryParams:{params1: null, param2: null}})
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.