Ich möchte die Werte von URL-Abfrageparametern mit AngularJS lesen. Ich greife mit der folgenden URL auf den HTML-Code zu:
http://127.0.0.1:8080/test.html?target=bob
Wie erwartet location.search
ist "?target=bob"
. Für den Zugriff auf den Wert von target habe ich verschiedene Beispiele im Web gefunden, aber keines davon funktioniert in AngularJS 1.0.0rc10. Insbesondere sind alle die folgenden undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
Weiß jemand was funktionieren wird? (Ich verwende $location
als Parameter für meinen Controller)
Aktualisieren:
Ich habe unten eine Lösung veröffentlicht, bin aber nicht ganz zufrieden damit. In der Dokumentation im Entwicklerhandbuch: Angular Services: Verwenden von $ location wird Folgendes beschrieben $location
:
Wann sollte ich $ location verwenden?
Jedes Mal, wenn Ihre Anwendung auf eine Änderung der aktuellen URL reagieren muss oder wenn Sie die aktuelle URL im Browser ändern möchten.
In meinem Szenario wird meine Seite von einer externen Webseite mit einem Abfrageparameter geöffnet, sodass ich nicht per se auf eine Änderung der aktuellen URL reagiere. Vielleicht $location
ist es nicht das richtige Werkzeug für den Job (für die hässlichen Details siehe meine Antwort unten). Ich habe daher den Titel dieser Frage von "Wie lese ich Abfrageparameter in AngularJS mit $ location?" Geändert. zu "Was ist die prägnanteste Methode zum Lesen von Abfrageparametern in AngularJS?". Natürlich könnte ich nur Javascript und reguläre Ausdrücke zum Parsen verwenden location.search
, aber wenn ich für etwas so Grundlegendes auf diese niedrige Ebene gehe, beleidigt dies wirklich die Sensibilität meines Programmierers.
Also: Gibt es einen besseren Weg $location
als ich in meiner Antwort oder gibt es eine prägnante Alternative?
http://127.0.0.1:8080/test.html#?target=bob
würde funktionieren, beachte das#
vor dem?
.$location
ist eine Routing-Methode der zweiten Ebene, die nicht an den Server gesendet wird.$location.search()['target']
funktioniert nachdem$locationProvider.html5Mode(true)
in einem modernen Browser aufgerufen wurde.Antworten:
Sie können $ routeParams (erfordert ngRoute ) in Ihren Controller einfügen . Hier ist ein Beispiel aus den Dokumenten:
BEARBEITEN: Sie können Abfrageparameter auch mit dem Dienst $ location (verfügbar in
ng
) abrufen und festlegen , insbesondere mit dersearch
Methode $ location.search () .$ routeParams sind nach dem ersten Laden des Controllers weniger nützlich.
$location.search()
kann jederzeit aufgerufen werden.quelle
Gut, dass Sie es geschafft haben, es mit dem HTML5-Modus zum Laufen zu bringen, aber es ist auch möglich, es im Hashbang-Modus zum Laufen zu bringen.
Sie könnten einfach verwenden:
um Zugriff auf den Suchparameter 'Ziel' zu erhalten.
Als Referenz finden Sie hier die funktionierende jsFiddle: http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
quelle
HTML5Mode(true)
nur Parameter nach # / verfügbar sind oder zu Beginn mit # / zur URL hinzugefügt werden.$location.search()
. Ich bin mir nicht sicher, warum diese Antwort sie dorthin bringt.$location.search()
.Um meine eigene Frage teilweise zu beantworten, finden Sie hier ein Arbeitsbeispiel für HTML5-Browser:
Der Schlüssel war,
$locationProvider.html5Mode(true);
wie oben beschrieben anzurufen . Es funktioniert jetzt beim Öffnenhttp://127.0.0.1:8080/test.html?target=bob
. Ich bin nicht glücklich darüber, dass es in älteren Browsern nicht funktioniert, aber ich könnte diesen Ansatz trotzdem verwenden.Eine Alternative, die mit älteren Browsern funktioniert, besteht darin, den
html5mode(true)
Anruf abzubrechen und stattdessen die folgende Adresse mit Hash + Schrägstrich zu verwenden:http://127.0.0.1:8080/test.html#/?target=bob
Die entsprechende Dokumentation finden Sie im Entwicklerhandbuch: Angular Services: Verwenden von $ location (seltsam, dass meine Google-Suche dies nicht gefunden hat ...).
quelle
ng-controller
Attribut von<body>
nicht auf gesetzt werdenMyApp
?<base href="https://stackoverflow.com/" />
Tag hinzufügen oderrequireBase: false
dem Aufruf von html5Mode einen weiteren Parameter hinzufügen. Details hierDies kann auf zwei Arten erfolgen:
$routeParams
Die beste und empfohlene Lösung ist die Verwendung
$routeParams
in Ihrem Controller. Es erfordert diengRoute
Installation des Moduls.$location.search()
.Hier gibt es eine Einschränkung. Es funktioniert nur im HTML5-Modus. Standardmäßig funktioniert es nicht für die URL, die kein Hash (
#
) enthälthttp://localhost/test?param1=abc¶m2=def
Sie können es zum Laufen bringen, indem Sie
#/
die URL hinzufügen .http://localhost/test#/?param1=abc¶m2=def
$location.search()
um ein Objekt zurückzugeben wie:quelle
$ location.search () funktioniert nur mit aktiviertem HTML5-Modus und nur mit unterstützendem Browser.
Das wird immer funktionieren:
$ window.location.search
quelle
Nur um zu sommerisieren.
Wenn Ihre App von externen Links geladen wird, erkennt Angular dies nicht als URL-Änderung, sodass $ loaction.search () Ihnen ein leeres Objekt geben würde. Um dies zu lösen, müssen Sie in Ihrer App-Konfiguration (app.js) Folgendes festlegen:
quelle
Nur eine Präzision zu Ellis Whiteheads Antwort.
$locationProvider.html5Mode(true);
funktioniert nicht mit der neuen Version von anglejs, ohne die Basis-URL für die Anwendung mit einem<base href="">
Tag anzugeben oder den Parameter aufrequireBase
zu setzenfalse
Aus dem Dokument :
quelle
Sie können auch $ location. $$ search.yourparameter verwenden
quelle
$$search
ist eine interne Variable, deren Verwendung keine so gute Idee ist.das kann dir helfen
Was ist die prägnanteste Methode zum Lesen von Abfrageparametern in AngularJS?
quelle
Ich habe festgestellt, dass HTML5Mode für ein SPA viele 404-Fehlerprobleme verursacht. In diesem Fall muss $ location.search nicht funktionieren. In meinem Fall möchte ich einen URL-Abfragezeichenfolgenparameter erfassen, wenn ein Benutzer zu meiner Site kommt, unabhängig davon, auf welche "Seite" er anfänglich verweist, UND sie nach dem Anmelden an diese Seite senden können. Also erfasse ich einfach alle das Zeug in app.run
dann später nach dem Login kann ich $ state.go sagen ($ rootScope.initialPage, $ rootScope.initialParams)
quelle
Es ist etwas spät, aber ich denke, Ihr Problem war Ihre URL. Wenn statt
Sie hatten
Ich bin mir ziemlich sicher, dass es funktioniert hätte. Angular ist sehr wählerisch in Bezug auf seine # /
quelle