let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');
Почему это не работает? Он устанавливает только 'aaa', а НЕ 'bbb'
Кроме того, у меня есть объект {aaa: 111, bbb: 222} Как я могу установить все значения без цикла?
ОБНОВЛЕНИЕ (похоже, это работает, но как избежать цикла?)
let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
httpParams = httpParams.append(key, data[key]);
});
angular
angular-http
Михалис
источник
источник
httpParams.set('bbb', '222');
должно работать. Я попробовал это первым и был очень сбит с толку. Но замените эту строчку наhttpParams = httpParams.set('bbb','222');
works. для тех, кто устанавливает только 2, также хорош ответ от другого пользователя ниже.Ответы:
До 5.0.0-beta.6
Начиная с 5.0.0-beta.6
источник
any
. Это действительно предполагаемое использование?{ params: <any>params }
чтобы избежать проблем с компилятором tsHttpParams должен быть неизменным. В
set
иappend
методы не изменять существующий экземпляр. Вместо этого они возвращают новые экземпляры с примененными изменениями.Этот подход хорошо работает с цепочкой методов:
... хотя это может быть неудобно, если вам нужно обернуть любое из них в условиях.
Ваш цикл работает, потому что вы захватываете ссылку на возвращенный новый экземпляр. Код, который вы опубликовали, не работает, не работает. Он просто вызывает set (), но не получает результат.
источник
В более поздних версиях
@angular/common/http
(5.0 и выше, судя по всему) вы можете использоватьfromObject
ключ,HttpParamsOptions
чтобы передать объект прямо:let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });
Это просто запускает
forEach
цикл под капотом :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]); });
источник
Как по мне, цепочка
set
методов - самый чистый способисточник
Пара простых альтернатив
Без использования
HttpParams
объектовИспользование
HttpParams
объектовисточник
Другой вариант сделать это:
источник
Поскольку класс HTTP Params является неизменным, вам необходимо связать метод set:
источник
Используя это, вы можете избежать петли.
Кроме того, я предлагаю сделать функцию toHttpParams в вашем часто используемом сервисе. Таким образом, вы можете вызвать функцию для преобразования объекта в HttpParams .
Обновить:
Это еще одна причина, по которой вы использовали одну общую функцию, такую как toHttpParams, упомянутую выше, вы можете легко удалить ее или внести изменения, если это необходимо.
источник
Насколько я могу судить по реализации на https://github.com/angular/angular/blob/master/packages/common/http/src/params.ts
Вы должны указать значения отдельно - вы не сможете избежать цикла.
Существует также конструктор, который принимает строку в качестве параметра, но он имеет форму,
param=value¶m2=value2
поэтому для вас нет сделки (в обоих случаях вы завершите цикл своим объектом).Вы всегда можете сообщить о проблеме / запросе функции в angular, что я настоятельно рекомендую: https://github.com/angular/angular/issues
PS: Не забывайте о разнице между
set
иappend
методами;)источник
Поскольку @MaciejTreder подтвердил, что мы должны зацикливаться, вот оболочка, которая при желании позволит вам добавить в набор параметров по умолчанию:
Вы можете использовать это так:
источник
Мой вспомогательный класс (ts) для преобразования любого сложного объекта dto (не только «строковый словарь») в HttpParams:
источник
params.ts
своя кодировка. Проверьте реализацию: github.com/angular/angular/blob/master/packages/common/http/src/…Просто хотел добавить, что если вы хотите добавить несколько параметров с одинаковым именем ключа, например: www.test.com/home?id=1&id=2
Используйте append, если вы используете set, оно перезапишет предыдущее значение с тем же именем ключа.
источник
Эти решения работают для меня,
let params = new HttpParams(); Object.keys(data).forEach(p => { params = params.append(p.toString(), data[p].toString()); });
источник