URL参数中的数组(Angular)

问题描述 投票:0回答:1

我有一个带复选框的过滤器,在选中后向url添加了参数,就像这样

https://localhost:8080/api/records?page=0&locationIds=1,2

但想成为这样的人

https://localhost:8080/api/records?page=0&locationIds=1&locationIds=2

根据我的理解,这是因为我向URL参数传递了一个数组,我的主要想法是重写这段话 forEach 不是为了'key',但对于'。httpParams[key]'的文件中 candidate.service.ts(不确定)但不知道怎么做才好,这是我的代码。

filter.service.ts. (在这个服务中,过滤器以数组形式返回)

filterByValues(filterType: string, value): FilterParams {
  if (!this.filterParams[filterType]) {
    this.filterParams[filterType] = [value];
  } else if (this.isValueInParams(this.filterParams[filterType], value)) {
    this.filterParams[filterType] = this.removeValueFromParams(this.filterParams[filterType], value);
  } else {
    this.filterParams[filterType].push(value); //return  [1, 2]
  }
  return this.filterParams;
}

isValueInParams(params, value) {
  return params.some(item => value === item);
}

我在其他文件中使用了这个服务,当我选中一些复选框时,这个ID被添加到Array中。

candidate-filter.ts

filterByLocation(location: Location) {
  const filtersToEmit = this.filterService.filterByValues(CandidateFilter.LOCATION, location.id);
  this.candidatesHttpParams.emit(filtersToEmit);
}

这里是我添加网址的地方。

candidate.service.ts

get(page: number, httpParams: FilterParams): Observable<Candidate[]> {
  let params = new HttpParams().set('page', page.toString());

  //My main thought is to rewrite this forEach not for 'key', but for 'httpParams[key]'. Not sure

  Object.keys(httpParams).forEach(key =>
  params = params.append(key, httpParams[key])); //key = locationIds, httpParams[key] = [1,2]
  return this.http.get<Candidate[]>(this.url, { params });
}

而在这里,实际上得到的是候选者

import-page.ts

 private getCandidates(page: number) {
this.candidateViewService.get(page, this.params) 

//this.params = {key: Array(2)} // [1, 2] 

  .subscribe(
    (candidates: CandidateView[]) => this.candidates = candidates,
    error => this.logger.error(error.message));
    console.log('this Params',this.params)
}

希望我的问题是清楚的。如果有任何帮助,我将感激不尽

angular http url foreach
1个回答
1
投票

你可以这样做。

如果你想从一个数组中为一个给定的键传递多个值(比如说 locationId),你需要重复 params.append(key, v),对于每个值 v 您的数组 ([1,2])

get(page: number, filterParams: any): Observable<Candidates[]> {
    let params = new HttpParams().set('page', page.toString());

    Object.keys(filterParams).forEach(key=>
    {
      let val: any = filterParams[key];

      if(Array.isArray(val)) //For arrays, repeatedly add values
      {
          for(let v of val)
          {
            params = params.append(key, v);
          }
      }
      else
      {
        params = params.append(key, val); //add value as is
      }

   });
 return this.http.get<any[]>(this.url, { params  });
}

Stackblitz演示 (查看网络标签以查看请求)


0
投票

检查这个JS的粗略例子,我希望它能引导你找到你需要的东西。

var page = 0;
var locationIds = [1, 2];
function getCall(baseUrl, page, locationIds) {

  let str = baseUrl + "?page" + page + "&"; // adding the first page params.
  locationIds.forEach((element, index) => {
    str += "locationsIds="+element;
    if (index < locationIds.length - 1) { //check if it's the last item or not
      str += "&";
    }
  });
  // do your http call (this.http refers to HttpClient)
    // this.http.get(str).subscribe((data) => {
  //   your code.
  // })
  return str; // only for the example purpose to log the str created;
};
console.log(getCall("http://localhost:8080/records", page, locationIds));

如果你在浏览器中查看开发控制台,在你的angular应用中取消修改http get调用后,你会在网络标签中看到你的请求。

enter image description here

我相信这不是用angular实现这个功能的唯一方法。但这是我脑海中出现的第一个方法。欢迎提出一些问题,以便在你的应用中进行整合。

© www.soinside.com 2019 - 2024. All rights reserved.