Angular - 结合params和queryParams observables

Mic*_*lis 3 angular angular-observable

如何将这些与可观察者合并为一个?它们具有相同的功能.

this.sub = this.route.params.subscribe((params: any) => {
    // functionality
});

this.sub = this.route.queryParams.subscribe((params: any) => {
    // same functionality   
});
Run Code Online (Sandbox Code Playgroud)

Jay*_*ase 5

你可以使用combineLatest来做到这一点:

import { ActivatedRoute } from '@angular/router';

import { combineLatest } from 'rxjs';

// ...

class MyComponent {

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {

    const params = this.route.params;
    const queryParams = this.route.queryParams;

    combineLatest(params, queryParams, (params, qparams) => ({ params, qparams }))
      .subscribe(allParams => console.log(allParams.params, allParams.qparams));
  }

}
Run Code Online (Sandbox Code Playgroud)

params和qparams将是属性名称为param名称且值为值的对象.所以对于一条路线:

 RouterModule.forRoot([{
  path: 'test1/:id',
  component: Test1Component
}])
Run Code Online (Sandbox Code Playgroud)

与params

http://localhost:4200/test1/paramvalue?qparam=qpvalue
Run Code Online (Sandbox Code Playgroud)

allParams将是

{ 
  params: { 
     id: "paramvalue" 
    },
  qparams: { 
     qparam: "qpvalue" 
    } 
 }
Run Code Online (Sandbox Code Playgroud)

  • 它工作正常,除了一种情况,将 url 从 http://localhost:4200/test1/paramvalue?qparam=qpvalue 更改为 http://localhost:4200/test1/otherParamValue。当时,combineLatest 运行两次,一次用于查询参数,另一次用于路径参数。我们该如何解决这个问题呢? (2认同)