从ANGLING 4.3开始,他们引入了HttpClient而不是http. 在HttpClient中,我不能使用URLSearchParams作为url查询参数.我用的不是URLSearchParams,而是HttpParams

这项工作

 var params = new HttpParams().append('a', '1').append('b', '2');

但这为什么行不通呢

var params = new HttpParams();
params.append('a', '1');
params.append('b', '2');

推荐答案

新的HTTP客户端可以处理不可变的请求对象及其所有组成部分,如HttpParamsHttpHeaders.要了解为什么要看Why is http request and all its constituent parts like HttpHeaders and HttpParams are immutable或读Insider’s guide into interceptors and HttpClient mechanics in Angular这篇文章.

这就是为什么append方法在每次调用append时合并合并的HttpParams对象的参数和returns the new instance:

  /**
   * Construct a new body with an appended value for the given parameter name.
   */
  append(param: string, value: string): HttpParams { 
        return this.clone({param, value, op: 'a'}); 
  }

  private clone(update: Update): HttpParams {
    const clone = new HttpParams({encoder: this.encoder}); <-------
    clone.cloneFrom = this.cloneFrom || this;
    clone.updates = (this.updates || []).concat([update]);
    return clone;                                          <--------
  }

所以这里:

var params = new HttpParams().append('a', '1').append('b', '2');

append with b参数更新append with a参数返回的对象.

而这种方法

var params = new HttpParams();
params.append('a', '1');
params.append('b', '2');

append始终更新HttpParams的初始状态,所有中间append操作实际上都被忽略.

因此,必须使用之前的返回值:

var params = new HttpParams();
params = params.append('a', '1');
params = params.append('b', '2');

或者使用fromObject的快捷方式:

let searchParams = new HttpParams({
    fromObject: {
        query: query,
        sort: sort,
        order: order
    }
});

const modified = req.clone({params: searchParams});

或者直接在请求时使用setParams方法:

const modified = req.clone({setParams: {'query': query, 'sort': sort, 'order': order}});

而且,从5.1开始.x您可以直接传递对象,而不是HttpParams的实例:

const params = {
  'a': '1',
  'b': '2'
};

this.http.get('...', { params })

Angular相关问答推荐

从嵌套组件导航到命名路由中的顶级路由

将kendo—colorpicker的kendo弹出窗口附加到组件''

RXJS运算符用于combineLatest,不含空值

在剑道UI网格中包装Excel导出的列

PrimeNg选项卡视图选项卡

如何确保[共享]组件是真正的哑组件?(Angular )

从canActivate创建时,Angular material 对话框不接收MAT_DIALOG_DATA

Angular 16模块中未使用的组件是否从Bundle 包中删除(树摇动)?

在父组件的子组件中使用 ng-template

缺少 .angular-cli.json 文件:Angular

angular4应用程序中输入的最小值和最大值

如何使用Angular4通过元素ID设置焦点

如何使用 Bootstrap 4 flexbox 填充可用内容?

在同一个组件中使用 MatSort 的多个 mat-table

样式 html,来自 Web 组件的正文

为什么Angular 12 'ng serve' 构建应用程序的速度很慢?

Angular 2 Material Design 组件是否支持布局指令?

如何使用 Angular 6 工作的 ngModel 创建自定义输入组件?

如何在 angular2 中的 div 的 contenteditable 上使用 [(ngModel)]?

输入更改时Angular2动态输入字段失go 焦点