Chciałbym odczytać wartości parametrów zapytania URL za pomocą AngularJS. Uzyskuję dostęp do kodu HTML za pomocą następującego adresu URL:
http://127.0.0.1:8080/test.html?target=bob
Zgodnie z oczekiwaniami location.search
jest "?target=bob"
. Aby uzyskać dostęp do wartości celu , znalazłem różne przykłady wymienione w Internecie, ale żaden z nich nie działa w AngularJS 1.0.0rc10. W szczególności są to undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
Czy ktoś wie, co będzie działać? (Używam $location
jako parametru do mojego kontrolera)
Aktualizacja:
Poniżej zamieściłem rozwiązanie, ale nie jestem do końca z niego zadowolony. Dokumentacja na stronie Developer Guide: Angular Services: Korzystanie z $ location zawiera następujące informacje na temat $location
:
Kiedy powinienem użyć $ location?
Za każdym razem, gdy aplikacja musi zareagować na zmianę bieżącego adresu URL lub jeśli chcesz zmienić bieżący adres URL w przeglądarce.
W moim scenariuszu moja strona zostanie otwarta z zewnętrznej strony internetowej z parametrem zapytania, więc per se nie reaguję na zmianę bieżącego adresu URL. Więc może $location
nie jest odpowiednie narzędzie do pracy (brzydkie szczegóły, patrz moja odpowiedź poniżej). Dlatego zmieniłem tytuł tego pytania z „Jak odczytać parametry zapytania w AngularJS za pomocą $ location?” na „Jaki jest najbardziej zwięzły sposób odczytywania parametrów zapytania w AngularJS?”. Oczywiście, mógłbym po prostu użyć javascript i wyrażeń regularnych do parsowania location.search
, ale przejście do niskiego poziomu dla czegoś tak podstawowego naprawdę obraża moją wrażliwość programisty.
Więc: czy jest lepszy sposób na użycie $location
niż w mojej odpowiedzi, czy też jest zwięzła alternatywa?
http://127.0.0.1:8080/test.html#?target=bob
będzie działać, zwróć uwagę na#
wcześniej?
.$location
to metoda routingu drugiego poziomu, która nie jest wysyłana do serwera.$location.search()['target']
działa po$locationProvider.html5Mode(true)
został wywołany w nowoczesnej przeglądarce.Odpowiedzi:
Możesz wstrzyknąć $ routeParams (wymaga ngRoute ) do swojego kontrolera. Oto przykład z dokumentów:
EDYCJA: Możesz również uzyskać i ustawić parametry zapytania za pomocą usługi $ location service (dostępna w
ng
), w szczególności jejsearch
metody: $ location.search () .$ routeParams są mniej przydatne po początkowym załadowaniu kontrolera;
$location.search()
można zadzwonić w dowolnym momencie.źródło
Dobrze, że udało ci się uruchomić go w trybie HTML5, ale można również sprawić, aby działał w trybie hashbang.
Możesz po prostu użyć:
aby uzyskać dostęp do parametru wyszukiwania „docelowego”.
Dla odniesienia, oto działający jsFiddle: http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
źródło
HTML5Mode(true)
to tylko parametry po # / są dostępne lub zostaną dodane do adresu z # / na początku.$location.search()
. Nie jestem pewien, dlaczego ta odpowiedź ich tam umieszcza.$location.search()
.Aby udzielić częściowej odpowiedzi na moje pytanie, oto działająca próbka dla przeglądarek HTML5:
Kluczem było zadzwonić,
$locationProvider.html5Mode(true);
jak opisano powyżej. Teraz działa podczas otwieraniahttp://127.0.0.1:8080/test.html?target=bob
. Nie podoba mi się to, że nie będzie działać w starszych przeglądarkach, ale i tak mogę skorzystać z tego podejścia.Alternatywą, która działałaby w starszych przeglądarkach, byłoby porzucenie
html5mode(true)
połączenia i użycie następującego adresu z krzyżykiem + ukośnikiem:http://127.0.0.1:8080/test.html#/?target=bob
Odpowiednia dokumentacja znajduje się w Podręczniku programisty: Angular Services: Korzystanie z $ location (dziwne, że moje wyszukiwanie w Google nie znalazło tego ...).
źródło
ng-controller
atrybutu ?<body>
MyApp
<base href="https://stackoverflow.com/" />
tag, albo dodaćrequireBase: false
jako inny parametr do wywołania html5Mode. Szczegóły tutajMożna to zrobić na dwa sposoby:
$routeParams
Najlepszym i zalecanym rozwiązaniem jest użycie go
$routeParams
w kontrolerze. Wymaga zainstalowaniangRoute
modułu.$location.search()
.Jest tutaj zastrzeżenie. Będzie działać tylko w trybie HTML5. Domyślnie nie działa dla adresu URL, który nie zawiera hash (
#
)http://localhost/test?param1=abc¶m2=def
Możesz sprawić, by działało, dodając
#/
adres URL.http://localhost/test#/?param1=abc¶m2=def
$location.search()
aby zwrócić obiekt taki jak:źródło
$ location.search () będzie działać tylko przy włączonym trybie HTML5 i tylko w obsługiwanej przeglądarce.
Działa to zawsze:
$ window.location.search
źródło
Tylko na lato.
Jeśli twoja aplikacja jest ładowana z zewnętrznych linków, to kątowy nie wykryje tego jako zmiany adresu URL, więc $ loaction.search () da ci pusty obiekt. Aby rozwiązać ten problem, musisz skonfigurować następujące opcje w konfiguracji aplikacji (app.js)
źródło
Tylko precyzja do odpowiedzi Ellisa Whitehead'a.
$locationProvider.html5Mode(true);
nie będzie działać z nową wersją angularjs bez określenia podstawowego adresu URL aplikacji za pomocą<base href="">
znacznika lub ustawienia parametrurequireBase
nafalse
Z dokumentu :
źródło
możesz także użyć $ location. $$ search.yourparameter
źródło
$$search
Jest zmienna wewnętrzna, których użycie nie jest taki dobry pomysł.to może ci pomóc
Jaki jest najbardziej zwięzły sposób odczytywania parametrów zapytania w AngularJS
źródło
Odkryłem, że dla SPA HTML5Mode powoduje wiele problemów z błędem 404 i nie jest konieczne, aby $ location.search działał w tym przypadku. W moim przypadku chcę przechwycić parametr ciągu zapytania adresu URL, gdy użytkownik odwiedza moją witrynę, niezależnie od tego, do której „strony” początkowo prowadzi łącze, ORAZ móc wysyłać je na tę stronę po zalogowaniu. Więc po prostu przechwytuję wszystkie te rzeczy w app.run
potem po zalogowaniu mogę powiedzieć $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)
źródło
Jest trochę późno, ale myślę, że twoim problemem był adres URL. Jeśli zamiast
miałeś
Jestem pewien, że to by zadziałało. Angular jest bardzo wybredny w kwestii swojego # /
źródło