【发布时间】:2018-09-07 15:23:43
【问题描述】:
我正在处理的项目有很多带有搜索、排序和分页功能的列表。我完全能够使用这些标准(搜索、排序、分页)从 API 获取数据。
但是,我被要求创建一个“可共享链接”,以便用户可以在两者之间共享他们查询的列表。如果用户 A 的列表按“客户”排序,并且在第 5 页上将链接发送给用户 B,他或她将在第 5 页上打开按“客户”排序的相同列表。很简单。
我有一个可行的解决方案。我在 ActiveRoute 上订阅 queryParams,解析这些参数,然后重新加载列表。请参阅下面的代码。
组件模板html:
<ngb-pagination [collectionSize]="size" [page]="page" (pageChange)="changePage" >
</ngb-pagination>
<pre>Current page: {{page}}</pre>
组件打字稿:
ngOnInit() {
this.route
.queryParams
.subscribe(queryParams => {
this.sort = queryParams['sort'];
this.search = queryParams['search'];
this.page= +queryParams['page'] || 1;
this.refresh();
});
this.refresh();
}
refresh() : void {
this.transactionsService.fetch({
from: (this.page - 1) * this.size,
take: this.size,
search: this.search,
sort: this.sort
}).subscribe(data => {
this.entities = data.entities;
this.total_size = data.total;
});
}
changePage(event: number) : void {
this.router.navigate(['/transactions'], {
queryParams : { page: event},
queryParamsHandling: 'merge'
});
}
但是,我认为这是一个肮脏的解决方案,尤其是任何操作都是通过路由器处理的。我想首先避免在 ngOnInit 中订阅,然后以这种方式更新 changePage 函数:
changePage(event: number) : void {
this.page = event;
this.refresh();
// update query params without triggering navigation
this.route.queryParams['page'] = this.page; ??????
}'
这怎么可能?
【问题讨论】:
-
为什么要避免订阅 ngOnInit ?这是处理查询参数更改的正确方法,并且使用更改的查询参数导航到同一页面将触发该订阅并正常工作 - 我会说您的解决方案是正确且干净的,并且您提出的更改会使其不太正确而且更混乱。
-
好吧,我还没有任何基准,所以我不能说哪个解决方案更快,或者换句话说,路由器的使用如何对性能产生负面影响。但是,我还没有找到任何与我当前解决方案中的工作方式相同的博客、教程甚至官方示例。这就是我担心的根源。
-
我目前的解决方案有第一个缺点:用户输入“账单”来搜索输入并点击搜索按钮。 Angular 导航到路由 /transaction?search=bills。订阅 ngOnInit() 中的 queryParams 可以正确处理更改并从 API 获取数据。到现在为止还挺好。但是,如果用户想用相同的查询再次搜索,实际上 queryParams 并没有变化,所以 subscribe 没有什么可处理的。
标签: angular typescript