Ich verwende Angular 5.0.3. Ich möchte meine Anwendung mit einer Reihe von Abfrageparametern wie starten /app?param1=hallo¶m2=123
. Jeder Tipp in Wie bekomme ich Abfrageparameter von der URL in Angular 2? funktioniert bei mir nicht
Irgendwelche Ideen, wie Abfrageparameter funktionieren?
private getQueryParameter(key: string): string {
const parameters = new URLSearchParams(window.location.search);
return parameters.get(key);
}
Diese private Funktion hilft mir, meine Parameter abzurufen, aber ich denke nicht, dass dies in einer neuen Angular-Umgebung der richtige Weg ist.
[Update:] Meine Haupt-App sieht aus wie
@Component({...})
export class AppComponent implements OnInit {
constructor(private route: ActivatedRoute) {}
ngOnInit(): void {
// would like to get query parameters here...
// this.route...
}
}
Antworten:
In Angular 5 wird durch Abonnieren auf die Abfrageparameter zugegriffen
this.route.queryParams
.Beispiel:
/app?param1=hallo¶m2=123
Auf die Pfadvariablen wird von zugegriffen
this.route.snapshot.params
Beispiel:
/param1/:param1/param2/:param2
quelle
Dies ist die sauberste Lösung für mich
quelle
Ich weiß, dass OP nach einer Angular 5-Lösung gefragt hat, aber dennoch nach allen, die auf diese Frage für neuere (6+) Angular-Versionen stoßen. Zitieren der Dokumente zu ActivatedRoute.queryParams (auf denen die meisten anderen Antworten basieren):
Nach dem Text & Tabellen , die einfache Möglichkeit , die Abfrage params bekommen würde wie folgt aussehen:
Weitere Informationen (z. B. erweiterte Wiederverwendung von Komponenten) finden Sie in diesem Dokumentenkapitel.
BEARBEITEN:
Wie in den Kommentaren unten richtig angegeben, ist diese Antwort falsch - zumindest für den von OP angegebenen Fall.
OP fragt nach globalen Abfrageparametern (/ app? Param1 = hallo & param2 = 123); In diesem Fall sollten Sie queryParamMap verwenden (genau wie in der Antwort @ dapperdan1985).
paramMap wird dagegen für routenspezifische Parameter verwendet (z. B. / app /: param1 /: param2, was zu / app / hallo / 123 führt).
Vielen Dank an @JasonRoyle und @daka für den Hinweis.
quelle
queryParamMap
nichtparamMap
abzurufen?paramMap
funktioniert nicht.Sie können auch HttpParams verwenden , z.
quelle
path: '', redirectTo: '/list'
. Der this.route.snapshot funktioniert bei mir nicht, da er redirectTo / list ist, wodurch der 'lang'-queryString entfernt wird. Aber diese Lösung funktioniert bei mir.AKTUALISIEREN
quelle
seine Arbeit für mich:
Weitere Optionen anzeigen Wie werden Abfrageparameter von der URL in angle2 abgerufen?
quelle
Ich bin über diese Frage gestolpert, als ich nach einer ähnlichen Lösung gesucht habe, aber ich brauchte nichts wie ein Routing auf Anwendungsebene oder mehr importierte Module.
Der folgende Code eignet sich hervorragend für meine Verwendung und erfordert keine zusätzlichen Module oder Importe.
http://localhost:4200/?param1=hello¶m2=123
Ausgänge:quelle
Abfrage- und Pfadparameter (Winkel 8)
Für URLs wie https://myapp.com/user/666/read?age=23 verwenden
AKTUALISIEREN
Wenn Sie verwenden
this.router.navigate([someUrl]);
und Ihre Abfrageparameter in einesomeUrl
Zeichenfolge eingebettet sind, codiert Angular eine URL und Sie erhalten so etwas wie https://myapp.com/user/666/read%3Fage%323 - und die obige Lösung führt zu einem falschen Ergebnis ( queryParams ist leer und Pfadparameter können an den letzten Pfadparameter geklebt werden, wenn er sich am Pfadende befindet. In diesem Fall wird die Art und Weise der Navigation auf diesemquelle
Leider ist die sauberste Lösung nicht die erweiterbarste Lösung. In neueren Versionen von Angular wird in den anderen Antworten vorgeschlagen, dass Sie die Abfrageparameter einfach mit ActivatedRoute Injectible und speziell mit der Snapshot-Eigenschaft abrufen können:
oder die Eigenschaft subscribe (wird in Fällen verwendet, in denen die Abfragezeichenfolge aktualisiert wird, z. B. beim Navigieren durch Benutzer-IDs):
Ich bin hier, um Ihnen zu sagen, dass diese Lösungen einen klaffenden Fehler aufweisen, der seit einiger Zeit nicht behoben wurde: https://github.com/angular/angular/issues/12157
Alles in allem besteht die einzige kugelsichere Lösung darin, gutes altes Vanille-Javascript zu verwenden. In diesem Fall habe ich einen Dienst zur URL-Manipulation erstellt:
quelle
Angular Router bietet die Methode parseUrl (url: string) , mit der die URL in UrlTree analysiert wird . Eine der Eigenschaften von UrlTree sind queryParams. So können Sie etw tun wie:
quelle
Wenn Sie ein leeres Routenobjekt haben, liegt dies hauptsächlich daran, dass Sie in Ihrer app.component.html keinen Router-Outlet verwenden.
Ohne dies können Sie kein aussagekräftiges Routenobjekt mit nicht leeren Unterobjekten, insbesondere params & queryParams, erhalten.
Versuchen Sie,
<router-outlet><router-outlet>
kurz vor dem Anruf Ihre hinzuzufügen<app-main-component></app-main-component>
Stellen Sie zuvor sicher, dass Sie Ihren Abfrageparameter im App-Routing bereit haben>, der die von der App-Komponente verwendete Klasse Route exportiert:
Als letztes verwende ich natürlich, um Ihren Parameter zu erhalten,
this.route.snapshot.params.dynamicParam
wobei dynamicParam der Name ist, der in Ihrer App-Routing-Komponente verwendet wird :)quelle
Seien Sie vorsichtig mit Ihren Routen. Ein "redirectTo" entfernt | drop alle Abfrageparameter.
Ich habe meine Hauptkomponente mit Abfrageparametern wie "/ main? Param1 = a & param2 = b" aufgerufen und gehe davon aus, dass meine Abfrageparameter in der Methode "ngOnInit ()" in der Hauptkomponente eintreffen, bevor die Weiterleitung der Umleitung wirksam wird.
Das ist aber falsch. Die Umleitung erfolgt zuvor. Löschen Sie die Abfrageparameter und rufen Sie die ngOnInit () -Methode in der Hauptkomponente ohne Abfrageparameter auf.
Ich habe die dritte Zeile meiner Routen in geändert
und jetzt sind meine Abfrageparameter in den Hauptkomponenten ngOnInit und auch in der PageOneComponent zugänglich.
quelle
Gefunden in: Übergeordnete Komponenten erhalten leere Parameter von ActivatedRoute
Arbeitete für mich:
quelle
Ich bin gerade auf dasselbe Problem gestoßen, und die meisten Antworten hier scheinen es nur für das interne Angular-Routing zu lösen, und dann einige für Routenparameter, die nicht mit den Anforderungsparametern identisch sind.
Ich vermute, dass ich einen ähnlichen Anwendungsfall habe wie die ursprüngliche Frage von Lars.
Für mich ist der Anwendungsfall zB Empfehlungsverfolgung:
Angular läuft weiter
mycoolpage.com
, mit Hash-Routing,mycoolpage.com
leitet also weitermycoolpage.com/#/
. Für die Überweisung sollte jedoch auch ein Link wie diesermycoolpage.com?referrer=foo
verwendet werden können. Leider entfernt Angular sofort die Anforderungsparameter und geht direkt zumycoolpage.com/#/
.Jede Art von 'Trick' mit der Verwendung einer leeren Komponente + AuthGuard und dem Abrufen von
queryParams
oderqueryParamMap
hat leider bei mir nicht funktioniert. Sie waren immer leer.Meine hackige Lösung bestand darin, dies in einem kleinen Skript zu erledigen, in
index.html
dem die vollständige URL mit abgerufen wird Anforderungsparametern abgerufen wird. Ich erhalte dann den Anforderungsparameterwert über eine Zeichenfolgenmanipulation und setze ihn auf ein Fensterobjekt. Ein separater Dienst übernimmt dann das Abrufen der ID vom Fensterobjekt.index.html Skript
Bedienung
quelle
quelle
http: // localhost: 4200 / products? order = beliebt
Wir können wie folgt auf den Bestellabfrageparameter zugreifen:
Es gibt auch queryParamMap, das ein Observable mit einem paramMap-Objekt zurückgibt.
Gegeben die folgende Routen-URL:
http: // localhost: 4200 / products? order = popular & filter = new
Quelle - https://alligator.io/angular/query-parameters/
quelle
Ich denke, Angular 8:
ActivatedRoute.params
wurde ersetzt durchActivatedRoute.paramMap
ActivatedRoute.queryParams
wurde ersetzt durchActivatedRoute.queryParamMap
quelle
quelle
Wenn Sie keinen Angular-Router verwenden, versuchen Sie es mit Querystring . Es installieren
zu Ihrem Projekt. Machen Sie in Ihrer Komponente so etwas
Das
substring(1)
ist notwendig, denn wenn Sie so etwas haben, lautet'/mypage?foo=bar'
der Schlüsselname für?foo
quelle