let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');
Mengapa ini tidak berhasil? Ini hanya mengatur 'aaa' dan BUKAN 'bbb'
Juga, saya punya objek {aaa: 111, bbb: 222} Bagaimana saya bisa mengatur semua nilai tanpa perulangan?
PEMBARUAN (ini sepertinya berhasil, tetapi bagaimana cara menghindari loop?)
let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
httpParams = httpParams.append(key, data[key]);
});
angular
angular-http
Michalis
sumber
sumber
httpParams.set('bbb', '222');
seharusnya berhasil. Saya mencoba yang pertama dan sangat bingung. Tapi gantilah baris itu denganhttpParams = httpParams.set('bbb','222');
karya. bagi mereka yang hanya menyetel 2, rangkaian jawaban dari Pengguna lain di bawah ini juga bagus.Jawaban:
Sebelum 5.0.0-beta.6
Sejak 5.0.0-beta.6
sumber
any
. Apakah itu benar-benar tujuan penggunaan?{ params: <any>params }
untuk menghindari masalah compiler tsHttpParams dimaksudkan agar tidak berubah. Metode
set
danappend
tidak mengubah instance yang ada. Sebaliknya, mereka mengembalikan instance baru, dengan perubahan yang diterapkan.Pendekatan ini bekerja dengan baik dengan rangkaian metode:
... meskipun itu mungkin canggung jika Anda perlu membungkusnya dalam kondisi tertentu.
Loop Anda berfungsi karena Anda mengambil referensi ke instance baru yang dikembalikan. Kode yang Anda posting itu tidak berfungsi, tidak berfungsi. Itu hanya memanggil set () tetapi tidak mengambil hasilnya.
sumber
Di versi yang lebih baru
@angular/common/http
(5.0 dan yang lebih baru, menurut tampilannya), Anda dapat menggunakanfromObject
kunci dariHttpParamsOptions
untuk meneruskan objek secara langsung:let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });
Ini hanya menjalankan satu
forEach
lingkaran di bawah tenda , meskipun:this.map = new Map<string, string[]>(); Object.keys(options.fromObject).forEach(key => { const value = (options.fromObject as any)[key]; this.map !.set(key, Array.isArray(value) ? value : [value]); });
sumber
Bagi saya,
set
metode rantai adalah cara terbersihsumber
Beberapa Alternatif Mudah
Tanpa menggunakan
HttpParams
ObjekMenggunakan
HttpParams
Objeksumber
Opsi lain untuk melakukannya adalah:
sumber
Karena kelas HTTP Params tidak dapat diubah, maka Anda perlu merangkai metode yang ditetapkan:
sumber
Dengan menggunakan ini, Anda dapat menghindari pengulangan.
Selanjutnya, saya sarankan membuat fungsi toHttpParams di layanan yang biasa Anda gunakan. Jadi Anda bisa memanggil fungsi untuk mengonversi objek ke HttpParams .
Memperbarui:
Ini adalah alasan lain jika Anda telah menggunakan satu fungsi umum seperti toHttpParams yang disebutkan di atas, Anda dapat dengan mudah menghapusnya atau melakukan perubahan jika diperlukan.
sumber
Sejauh yang saya lihat dari implementasinya di https://github.com/angular/angular/blob/master/packages/common/http/src/params.ts
Anda harus memberikan nilai secara terpisah - Anda tidak dapat menghindari loop Anda.
Ada juga konstruktor yang mengambil string sebagai parameter, tetapi dalam bentuk
param=value¶m2=value2
sehingga tidak ada kesepakatan untuk Anda (dalam kedua kasus Anda akan menyelesaikan perulangan objek Anda).Anda selalu dapat melaporkan masalah / permintaan fitur ke sudut, yang sangat saya sarankan: https://github.com/angular/angular/issues
PS: Ingat tentang perbedaan antara
set
danappend
metode;)sumber
Karena @MaciejTreder mengonfirmasi bahwa kita harus melakukan loop, berikut adalah pembungkus yang secara opsional memungkinkan Anda menambahkan ke satu set parameter default:
Anda dapat menggunakannya seperti ini:
sumber
Kelas pembantu saya (ts) untuk mengonversi objek dto yang kompleks (tidak hanya "kamus string") menjadi HttpParams:
sumber
params.ts
memiliki pengkodeannya sendiri. Periksa implementasinya: github.com/angular/angular/blob/master/packages/common/http/src/…Hanya ingin menambahkan itu jika Anda ingin menambahkan beberapa parameter dengan nama kunci yang sama misalnya: www.test.com/home?id=1&id=2
Gunakan append, jika Anda menggunakan set, itu akan menimpa nilai sebelumnya dengan nama kunci yang sama.
sumber
Solusi ini bekerja untuk saya,
let params = new HttpParams(); Object.keys(data).forEach(p => { params = params.append(p.toString(), data[p].toString()); });
sumber