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
set
yappend
no 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 lafromObject
clave deHttpParamsOptions
para pasar el objeto directamente:let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });
Sin embargo, esto solo tiene un
forEach
bucle 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
set
métodos es la forma más limpiafuente
Un par de alternativas fáciles
Sin usar
HttpParams
objetosUsando
HttpParams
objetosfuente
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=value2
por 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
set
yappend
;)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.ts
tiene 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