Angular 当我们只改变顺序时,路由器不发出查询参数
Angular router is not emitting query params when we only change the order
我有一个使用后端的大型应用程序,我们可以使用查询参数进行排序:
my-resource?field1=asc&field2=desc will gives order by field1 asc, field2 desc
但有时,我会反转这些参数:
my-resource?field2=desc&field1=asc will gives order by field2 desc, field1 asc
所以在我的代码中,我有一个使用 url 树和 navigateByUrl
发出新查询参数的组件:
url = 'my-resource';
navigateTo() {
this.navigateByUrl(this.getUrlTree())
}
getUrlTree() {
this.router.createUrlTree([this.url], { queryParams: this.orderedQueryParams });
}
我还有另一个组件可以监听 queryParams 的变化:
constructor(private _route: ActivatedRoute) {}
ngOnInit() {
this._route.queryParams
.takeUntil(this._destroyed$)
.do(async params => {
console.log('params', params);
this.doRequestToResource(params);
}).subscribe();
}
问题是,当我从 ?field1=asc&field2=desc
导航到 ?field2=desc&field1=asc
时,当我从 field1=asc&field2=desc
导航到 field1=desc&field2=asc
时,我没有在 queryParams observable 中收到事件它有效,但如果我们尝试颠倒参数的顺序,它不会发出任何可观察到的值。
我猜 Angular 正在考虑这是相同的 url 并且不会触发事件。
作为(肮脏的)解决方法,您可以向 url 添加一个查询参数,每次调用导航时该参数都会增加(或切换)(当然您必须在您的后端)。
例如,您可以将当前时间戳添加到查询参数中以强制触发事件:
this.router.navigateByUrl(path + '&t=' + new Date().getTime());
这样,queryParams 更改检测发生并触发事件。
由于顺序对您很重要,因此查询参数可能需要另一种方法。
一个想法是像这样只使用一个查询参数
example.is/?q=field1;desc,field2;asc
然后在您的代码中,您只需进行一些拆分即可获得参数。
这不是经过测试的代码,只是为了让大家理解这个想法
const splitted = params.split(',') // results = ['field1;desc', 'field2;asc']
const more_split = splitted.map(_ => _.split(';'))
我有一个使用后端的大型应用程序,我们可以使用查询参数进行排序:
my-resource?field1=asc&field2=desc will gives
order by field1 asc, field2 desc
但有时,我会反转这些参数:
my-resource?field2=desc&field1=asc will gives
order by field2 desc, field1 asc
所以在我的代码中,我有一个使用 url 树和 navigateByUrl
发出新查询参数的组件:
url = 'my-resource';
navigateTo() {
this.navigateByUrl(this.getUrlTree())
}
getUrlTree() {
this.router.createUrlTree([this.url], { queryParams: this.orderedQueryParams });
}
我还有另一个组件可以监听 queryParams 的变化:
constructor(private _route: ActivatedRoute) {}
ngOnInit() {
this._route.queryParams
.takeUntil(this._destroyed$)
.do(async params => {
console.log('params', params);
this.doRequestToResource(params);
}).subscribe();
}
问题是,当我从 ?field1=asc&field2=desc
导航到 ?field2=desc&field1=asc
时,当我从 field1=asc&field2=desc
导航到 field1=desc&field2=asc
时,我没有在 queryParams observable 中收到事件它有效,但如果我们尝试颠倒参数的顺序,它不会发出任何可观察到的值。
我猜 Angular 正在考虑这是相同的 url 并且不会触发事件。
作为(肮脏的)解决方法,您可以向 url 添加一个查询参数,每次调用导航时该参数都会增加(或切换)(当然您必须在您的后端)。
例如,您可以将当前时间戳添加到查询参数中以强制触发事件:
this.router.navigateByUrl(path + '&t=' + new Date().getTime());
这样,queryParams 更改检测发生并触发事件。
由于顺序对您很重要,因此查询参数可能需要另一种方法。
一个想法是像这样只使用一个查询参数
example.is/?q=field1;desc,field2;asc
然后在您的代码中,您只需进行一些拆分即可获得参数。
这不是经过测试的代码,只是为了让大家理解这个想法
const splitted = params.split(',') // results = ['field1;desc', 'field2;asc']
const more_split = splitted.map(_ => _.split(';'))