Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 动态设置HttpParams()主体_Typescript_Angular6_Angular Httpclient - Fatal编程技术网

Typescript 动态设置HttpParams()主体

Typescript 动态设置HttpParams()主体,typescript,angular6,angular-httpclient,Typescript,Angular6,Angular Httpclient,在Angular 5 HttpClient中,我可以这样设置HttpParams() const body=new-HttpParams() .set('电子邮件','test@mail.com') .set('password','pass'); 但是当我试图以这种方式设置HttpParams()时。未设置这些值 const paramsMap=newmap(); 参数映射集(“电子邮件”test@mail.com"); 参数集(“密码”、“通行证”); paramsMap.forEach(

在Angular 5 HttpClient中,我可以这样设置HttpParams()

const body=new-HttpParams()
.set('电子邮件','test@mail.com')
.set('password','pass');
但是当我试图以这种方式设置HttpParams()时。未设置这些值

const paramsMap=newmap();
参数映射集(“电子邮件”test@mail.com");
参数集(“密码”、“通行证”);
paramsMap.forEach((值:任意,键:任意)=>{
body.set(键、值);
});

为什么它没有被设定?我怎样才能以类似的方式做到这一点呢?

API略有不同,通过这种方式,您可以发送查询字符串中带有参数的动态请求

let paramsMap = new Map<any,any>();
paramsMap.set('username','admin');
paramsMap.set('password','admin');

let params = new HttpParams();
paramsMap.forEach((value: any, key: any) => {
  params = params.set(key, value);
});

return this.http.request<any>('post', this.url + LOGIN_URL, { 'params': params});
让paramsMap=newmap();
paramsMap.set('username','admin');
paramsMap.set('password','admin');
设params=newhttpparams();
paramsMap.forEach((值:任意,键:任意)=>{
参数=参数集(键、值);
});
返回this.http.request('post',this.url+LOGIN_url,{'params':params});
如果您检查HttpClient方法,您可以看到它是如何工作的

对第一条评论的回答:

HttpParams它不是不可变的,它用于将参数传递给查询字符串。 所以你需要的是:

let paramsMap = new Map<any,any>();
paramsMap.set('email','test@mail.com');
paramsMap.set('password','pass');   

return this.http.post<any>(this.url + LOGIN_URL, mapToObject(paramsMap));

/**
 * recursive function that receive a Map and returns a JSON object
 * @param map
 * @returns {any}
 */
function mapToObject(map) {
  const out = Object.create(null)
  map.forEach((value, key) => {
    if (value instanceof Map) {
      out[key] = mapToObject(value)
    }
    else {
      out[key] = value
    }
  });
  return out
}
让paramsMap=newmap();
paramsMap.set('email','test@mail.com');
paramsMap.set('password','pass');
返回this.http.post(this.url+LOGIN_url,mapToObject(paramsMap));
/**
*接收映射并返回JSON对象的递归函数
*@param-map
*@returns{any}
*/
函数mapToObject(映射){
const out=Object.create(空)
map.forEach((值,键)=>{
if(映射的值实例){
out[key]=mapToObject(值)
}
否则{
out[键]=值
}
});
返回
}

HttpParams是不可变的,因此每次使用set()方法时,它都会返回一个新实例。您可以通过更新引用来解决此问题:

const参数={
测试:“正确”
}
设httpParams=newHttpParams();
Object.keys(params.forEach)(k=>{
httpParams=httpParams.set(k,params[k]);
});
log(httpParams.get('test')请尝试以下操作:

让searchParams=new-HttpParams();
for(对象条目的常数[k,v](数据)){
log(`${k}:${v}`);
如果(v!=''| | v!==未定义){
searchParams=searchParams.append(k,v);
}
}

谢谢你的回答。但这永远不会奏效。HttpParams()是不可变的,因此这些值不会设置HttpParams()。@Fire手套我面临着同样类型的问题,如果可能的话,你能帮我吗