Я хотел бы прочитать значения параметров запроса URL, используя AngularJS. Я получаю доступ к HTML со следующего URL:
http://127.0.0.1:8080/test.html?target=bob
Как и ожидалось, location.search
есть "?target=bob"
. Для доступа к значению target я нашел несколько примеров в Интернете, но ни один из них не работает в AngularJS 1.0.0rc10. В частности, это все undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
Кто-нибудь знает, что будет работать? (Я использую $location
в качестве параметра для моего контроллера)
Обновить:
Я разместил решение ниже, но я не совсем доволен им. Документация в Руководстве разработчика: Angular Services: использование $ location гласит следующее $location
:
Когда я должен использовать $ location?
Каждый раз, когда ваше приложение должно реагировать на изменение текущего URL или если вы хотите изменить текущий URL в браузере.
В моем случае моя страница будет открыта с внешней веб-страницы с параметром запроса, поэтому я не "реагирую на изменение текущего URL" как таковой. Так что, возможно, $location
это не тот инструмент для работы (подробности см. Ниже). Поэтому я изменил название этого вопроса с «Как читать параметры запроса в AngularJS, используя $ location?» на «Какой самый краткий способ прочитать параметры запроса в AngularJS?». Очевидно, что я мог бы просто использовать javascript и регулярные выражения для разбора location.search
, но переход на этот низкоуровневый уровень для чего-то такого базового действительно оскорбляет мои чувства программиста.
Итак: есть ли лучший способ использовать, $location
чем я в своем ответе, или есть краткая альтернатива?
http://127.0.0.1:8080/test.html#?target=bob
будет работать, обратите внимание,#
прежде чем?
.$location
это метод маршрутизации второго уровня, который не отправляется на сервер.$location.search()['target']
работает после того,$locationProvider.html5Mode(true)
как был вызван в современном браузере.Ответы:
Вы можете добавить $ routeParams (требуется ngRoute ) в свой контроллер. Вот пример из документации:
РЕДАКТИРОВАТЬ: Вы также можете получить и установить параметры запроса с помощью службы $ location (доступной в
ng
), особенно ееsearch
метода: $ location.search () .$ routeParams менее полезны после начальной загрузки контроллера;
$location.search()
можно вызвать в любое время.источник
Хорошо, что вам удалось заставить его работать в режиме html5, но также можно заставить его работать в режиме hashbang.
Вы можете просто использовать:
чтобы получить доступ к поисковому параметру «target».
Для справки вот рабочий jsFiddle: http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
источник
HTML5Mode(true)
тогда доступны только параметры после # / или добавляются в URL с # / в начале.$location.search()
. Я не уверен, почему этот ответ помещает их туда.$location.search()
.Чтобы дать частичный ответ на мой собственный вопрос, вот рабочий пример для браузеров HTML5:
Ключ должен был позвонить
$locationProvider.html5Mode(true);
как сделано выше. Теперь работает при открытииhttp://127.0.0.1:8080/test.html?target=bob
. Я не рад тому факту, что он не будет работать в старых браузерах, но я мог бы использовать этот подход в любом случае.Альтернативой, которая работала бы со старыми браузерами, было бы отбросить
html5mode(true)
вызов и использовать вместо него следующий адрес с hash + slash:http://127.0.0.1:8080/test.html#/?target=bob
Соответствующая документация находится в Руководстве разработчика: Angular Services: использование $ location (странно, что мой поиск в Google не нашел этого ...).
источник
ng-controller
атрибут<body>
быть установлен вMyApp
?<base href="https://stackoverflow.com/" />
тег, либо добавить вrequireBase: false
качестве другого параметра вызов html5Mode. Подробности здесьЭто можно сделать двумя способами:
$routeParams
Лучшее и рекомендуемое решение - использовать
$routeParams
в вашем контроллере. Требует установкиngRoute
модуля.$location.search()
.Здесь есть оговорка. Он будет работать только в режиме HTML5. По умолчанию он не работает для URL, в котором нет hash (
#
)http://localhost/test?param1=abc¶m2=def
Вы можете заставить это работать, добавляя
#/
в URL.http://localhost/test#/?param1=abc¶m2=def
$location.search()
вернуть объект как:источник
$ location.search () будет работать только при включенном режиме HTML5 и только при поддержке браузера.
Это будет работать всегда:
$ window.location.search
источник
Просто подвести итог.
Если ваше приложение загружается из внешних ссылок, то angular не обнаружит это как изменение URL, поэтому $ loaction.search () выдаст вам пустой объект. Чтобы решить эту проблему, вам нужно установить следующее в вашем приложении config (app.js)
источник
Просто точность ответа Эллис Уайтхед.
$locationProvider.html5Mode(true);
не будет работать с новой версией angularjs без указания базового URL-адреса для приложения с<base href="">
тегом или установки параметраrequireBase
наfalse
Из документа :
источник
Вы также можете использовать $ location. $$ search.yourparameter
источник
$$search
Внутренняя переменная, использование которой не является такой хорошей идеей.это может помочь тебе
Какой самый краткий способ прочитать параметры запроса в AngularJS
источник
Я обнаружил, что для SPA HTML5Mode вызывает много проблем с ошибкой 404, и в этом случае нет необходимости заставлять $ location.search работать. В моем случае я хочу получить параметр строки URL-запроса, когда пользователь заходит на мой сайт, независимо от того, на какую «страницу» они изначально ссылаются, и иметь возможность отправить их на эту страницу после входа в систему. Поэтому я просто собираю все этот материал в app.run
затем, после входа в систему, я могу сказать $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)
источник
Уже немного поздно, но я думаю, что вашей проблемой был ваш URL. Если вместо
у вас
Я уверен, что это сработало бы. Angular действительно требователен к своему # /
источник