let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');
Warum funktioniert das nicht? Es wird nur das 'aaa' und NICHT das 'bbb' gesetzt.
Außerdem habe ich ein Objekt {aaa: 111, bbb: 222}. Wie kann ich alle Werte ohne Schleife festlegen?
UPDATE (dies scheint zu funktionieren, aber wie kann die Schleife vermieden werden?)
let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
httpParams = httpParams.append(key, data[key]);
});
angular
angular-http
Michalis
quelle
quelle
httpParams.set('bbb', '222');
das funktionieren sollte. Ich habe das zuerst versucht und war sehr verwirrt. Aber ersetzen Sie diese Zeile durchhttpParams = httpParams.set('bbb','222');
Werke. Für diejenigen, die nur 2 setzen, ist die Verkettungsantwort eines anderen Benutzers unten ebenfalls nett.Antworten:
Vor 5.0.0-beta.6
Seit 5.0.0-beta.6
quelle
any
. Ist das wirklich der Verwendungszweck?{ params: <any>params }
, um Probleme mit dem Compiler zu vermeidenHttpParams soll unveränderlich sein. Die Methoden
set
undappend
ändern die vorhandene Instanz nicht. Stattdessen geben sie neue Instanzen mit den vorgenommenen Änderungen zurück.Dieser Ansatz funktioniert gut mit Methodenverkettung:
... obwohl das unangenehm sein kann, wenn Sie einen von ihnen unter bestimmten Bedingungen einwickeln müssen.
Ihre Schleife funktioniert, weil Sie einen Verweis auf die zurückgegebene neue Instanz abrufen. Der Code, den Sie gepostet haben und der nicht funktioniert, funktioniert nicht. Es ruft nur set () auf, erfasst aber nicht das Ergebnis.
quelle
In neueren Versionen von
@angular/common/http
(5.0 und höher , wie es aussieht) können Sie denfromObject
Schlüssel von verwendenHttpParamsOptions
, um das Objekt direkt zu übergeben:Dies führt jedoch nur eine
forEach
Schleife unter der Haube :quelle
Verkettungsmethoden
set
sind für mich der sauberste Wegquelle
Ein paar einfache Alternativen
Ohne
HttpParams
Objekte zu verwendenMit
HttpParams
Objektenquelle
Eine andere Möglichkeit, dies zu tun, ist:
quelle
Da die HTTP-Params-Klasse unveränderlich ist, müssen Sie die set-Methode verketten:
quelle
Auf diese Weise können Sie die Schleife vermeiden.
Darüber hinaus empfehle ich, toHttpParams in Ihrem häufig verwendeten Dienst funktionsfähig zu machen. Sie können also die Funktion aufrufen, um das Objekt in die HttpParams zu konvertieren .
Aktualisieren:
Dies ist der andere Grund, warum Sie, wenn Sie eine allgemeine Funktion wie die oben genannten toHttpParams verwendet haben , diese einfach entfernen oder bei Bedarf Änderungen vornehmen können.
quelle
Soweit ich aus der Implementierung unter https://github.com/angular/angular/blob/master/packages/common/http/src/params.ts ersehen kann
Sie müssen Werte separat angeben - Sie können Ihre Schleife nicht umgehen.
Es gibt auch einen Konstruktor, der eine Zeichenfolge als Parameter verwendet, diese jedoch in der Form vorliegt,
param=value¶m2=value2
sodass für Sie kein Deal besteht (in beiden Fällen beenden Sie die Schleife Ihres Objekts).Sie können Angular jederzeit eine Problem- / Funktionsanforderung melden, was ich dringend empfehle: https://github.com/angular/angular/issues
PS: Denken Sie an den Unterschied zwischen
set
undappend
Methoden;)quelle
Da @MaciejTreder bestätigt hat, dass eine Schleife ausgeführt werden muss, finden Sie hier einen Wrapper, mit dem Sie optional eine Reihe von Standardparametern hinzufügen können:
Sie können es so verwenden:
quelle
Meine Hilfsklasse (ts) zum Konvertieren eines komplexen dto-Objekts (nicht nur "String-Wörterbuch") in HttpParams:
quelle
params.ts
hat eine eigene Codierung. Überprüfen Sie die Implementierung: github.com/angular/angular/blob/master/packages/common/http/src/…Diese Lösungen funktionieren für mich,
let params = new HttpParams(); Object.keys(data).forEach(p => { params = params.append(p.toString(), data[p].toString()); });
quelle
Ich wollte das nur hinzufügen, wenn Sie mehrere Parameter mit demselben Schlüsselnamen hinzufügen möchten, zum Beispiel: www.test.com/home?id=1&id=2
Verwenden Sie Anhängen. Wenn Sie set verwenden, wird der vorherige Wert mit demselben Schlüsselnamen überschrieben.
quelle