let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');
Por que isso não funciona? Ele apenas define o 'aaa' e NÃO o 'bbb'
Além disso, tenho um objeto {aaa: 111, bbb: 222} Como posso definir todos os valores sem loop?
ATUALIZAÇÃO (parece funcionar, mas como evitar o loop?)
let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
httpParams = httpParams.append(key, data[key]);
});
angular
angular-http
Michalis
fonte
fonte
httpParams.set('bbb', '222');
deve funcionar. Eu tentei isso primeiro e fiquei muito confuso. Mas substitua essa linha porhttpParams = httpParams.set('bbb','222');
obras. para aqueles que estão configurando apenas 2, o encadeamento de resposta de outro usuário abaixo também é bom.Respostas:
Antes de 5.0.0-beta.6
Desde 5.0.0-beta.6
fonte
any
. Esse é realmente o uso pretendido?{ params: <any>params }
para evitar problemas de compilador tsHttpParams deve ser imutável. Os métodos
set
eappend
não modificam a instância existente. Em vez disso, eles retornam novas instâncias, com as alterações aplicadas.Esta abordagem funciona bem com encadeamento de métodos:
... embora isso possa ser estranho se você precisar envolver qualquer um deles em condições.
Seu loop funciona porque você está capturando uma referência para a nova instância retornada. O código que você postou que não funciona, não funciona. Ele apenas chama set (), mas não pega o resultado.
fonte
Em versões mais recentes do
@angular/common/http
(5.0 e superiores, pelo que parece), você pode usar afromObject
chave deHttpParamsOptions
para passar o objeto diretamente em:let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });
Isso apenas faz um
forEach
loop sob o capô :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]); });
fonte
Quanto a mim, os
set
métodos de encadeamento são a maneira mais limpafonte
Algumas alternativas fáceis
Sem usar
HttpParams
objetosUsando
HttpParams
objetosfonte
Outra opção para fazer isso é:
fonte
Como a classe HTTP Params é imutável, você precisa encadear o método definido:
fonte
Usando isso, você pode evitar o loop.
Além disso, sugiro fazer a função toHttpParams em seu serviço comumente usado. Portanto, você pode chamar a função para converter o objeto em HttpParams .
Atualizar:
Este é o outro motivo, se você usou uma função comum como toHttpParams mencionada acima, você pode removê-la facilmente ou fazer alterações, se necessário.
fonte
Pelo que posso ver da implementação em https://github.com/angular/angular/blob/master/packages/common/http/src/params.ts
Você deve fornecer valores separadamente - Você não pode evitar seu loop.
Há também um construtor que recebe uma string como parâmetro, mas está na forma,
param=value¶m2=value2
então não há acordo para você (em ambos os casos, você terminará com o loop de seu objeto).Você sempre pode relatar um problema / solicitação de recurso para angular, o que eu recomendo fortemente: https://github.com/angular/angular/issues
PS: Lembre-se da diferença entre os métodos
set
eappend
;)fonte
Uma vez que @MaciejTreder confirmou que precisamos fazer um loop, aqui está um wrapper que, opcionalmente, permitirá que você adicione a um conjunto de parâmetros padrão:
Você pode usá-lo assim:
fonte
Minha classe auxiliar (ts) para converter qualquer objeto dto complexo (não apenas "dicionário de string") em HttpParams:
fonte
params.ts
tem sua própria codificação. Verifique a implementação: github.com/angular/angular/blob/master/packages/common/http/src/…Só queria adicionar isso se você quiser adicionar vários parâmetros com o mesmo nome de chave, por exemplo: www.test.com/home?id=1&id=2
Use append, se você usar set, ele sobrescreverá o valor anterior com o mesmo nome de chave.
fonte
Essas soluções estão funcionando para mim,
let params = new HttpParams(); Object.keys(data).forEach(p => { params = params.append(p.toString(), data[p].toString()); });
fonte