let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');
¿Por qué esto no funciona? Solo establece el 'aaa' y NO el 'bbb'
Además, tengo un objeto {aaa: 111, bbb: 222} ¿Cómo puedo establecer todos los valores sin bucles?
ACTUALIZAR (esto parece funcionar, pero ¿cómo se puede evitar el bucle?)
let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
httpParams = httpParams.append(key, data[key]);
});
angular
angular-http
Michalis
fuente
fuente

httpParams.set('bbb', '222');debería funcionar. Probé eso primero y estaba muy confundido. Pero reemplace esa línea conhttpParams = httpParams.set('bbb','222');obras. para aquellos que solo están configurando 2, la respuesta de encadenamiento de otro usuario a continuación también es agradable.Respuestas:
Antes de 5.0.0-beta.6
Desde 5.0.0-beta.6
fuente
any. ¿Es ese realmente el uso previsto?{ params: <any>params }para evitar problemas con el compilador de tsHttpParams está destinado a ser inmutable. Los métodos
setyappendno modifican la instancia existente. En su lugar, devuelven nuevas instancias, con los cambios aplicados.Este enfoque funciona bien con el encadenamiento de métodos:
... aunque eso podría ser incómodo si necesita envolver cualquiera de ellos en condiciones.
Su ciclo funciona porque está tomando una referencia a la nueva instancia devuelta. El código que publicaste que no funciona, no funciona. Simplemente llama a set () pero no toma el resultado.
fuente
En versiones más recientes de
@angular/common/http(5.0 y posteriores, por lo que parece), puede usar lafromObjectclave deHttpParamsOptionspara pasar el objeto directamente:let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });Sin embargo, esto solo tiene un
forEachbucle debajo del 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]); });fuente
En cuanto a mí, encadenar
setmétodos es la forma más limpiafuente
Un par de alternativas fáciles
Sin usar
HttpParamsobjetosUsando
HttpParamsobjetosfuente
Otra opción para hacerlo es:
fuente
Dado que la clase HTTP Params es inmutable, debe encadenar el método set:
fuente
Usando esto puedes evitar el bucle.
Además, sugiero hacer que toHttpParams funcione en su servicio de uso común. Entonces puede llamar a la función para convertir el objeto a HttpParams .
Actualizar:
Esta es la otra razón por la que si ha utilizado una función común como toHttpParams mencionada anteriormente, puede eliminarla fácilmente o hacer cambios si es necesario.
fuente
Por lo que puedo ver en la implementación en https://github.com/angular/angular/blob/master/packages/common/http/src/params.ts
Debe proporcionar valores por separado: no puede evitar su bucle.
También hay un constructor que toma una cadena como parámetro, pero tiene la forma
param=value¶m2=value2por lo que no hay ningún acuerdo para ti (en ambos casos terminarás con el bucle de tu objeto).Siempre puede informar un problema / solicitud de función a angular, lo que recomiendo encarecidamente: https://github.com/angular/angular/issues
PD: Recuerde la diferencia entre los métodos
setyappend;)fuente
Dado que @MaciejTreder confirmó que tenemos que hacer un bucle, aquí hay un contenedor que opcionalmente le permitirá agregar a un conjunto de parámetros predeterminados:
Puedes usarlo así:
fuente
Mi clase auxiliar (ts) para convertir cualquier objeto dto complejo (no solo "diccionario de cadenas") a HttpParams:
fuente
params.tstiene su propia codificación. Verifique la implementación: github.com/angular/angular/blob/master/packages/common/http/src/…Solo quería agregar eso si desea agregar varios parámetros con el mismo nombre de clave, por ejemplo: www.test.com/home?id=1&id=2
Use append, si usa set, sobrescribirá el valor anterior con el mismo nombre de clave.
fuente
Estas soluciones funcionan para mí,
let params = new HttpParams(); Object.keys(data).forEach(p => { params = params.append(p.toString(), data[p].toString()); });fuente