我有一个库存应用程序(设备和浏览器),用户可以在其中保留爱好零件的库存。我有一个显示零件类别(零件箱)的仪表板。如果单击该类别,您会看到该类别中的零件,然后如果您单击某个零件,您将转到零件页面。
TL:博士;在底部。
仪表板 -> 箱 -> 零件
我正在使用Router
并navigationExtras
改变它queryParams
,我遇到了一些奇怪的问题。我将 queryParams 附加到 URL,以便用户可以在浏览器上添加书签或复制/粘贴 URL。
在仪表板页面上,当我点击一个垃圾箱时,我会得到垃圾箱的“类别”并将其作为一个queryParam
垃圾箱页面发送:
goToBin(type) {
const navigationExtras = {
queryParams: {
type: (type) ? type : 'all',
}
};
console.log('Go To Bin:', type, navigationExtras);
this.router.navigate(['dashboard/bins'], navigationExtras);
}
这很好用,当我进入 bins 页面时,我会收到 queryParams 并快速调用我的服务以获取仅与该类别相关的数组中的部分:
ionViewWillEnter() {
this.route.queryParams.subscribe(params => {
console.log('Received on Bin Page:', params);
this.type = params['type'];
});
this.database.initDatabase(); // Only fires when loading this page fresh
this.getBinParts();
}
这工作正常。然后在同一页面上,我将另一个带有部件 ID 的 queryParam 发送到部件页面,并且基本上对部件数组执行相同的操作:
Bins 页面 - 将 queryParams 发送到 Parts 页面
goToPart(part) {
const navigationExtras = {
queryParams: {
pid: part.id,
fromBin: true,
}
};
console.log('Go To Part', part, navigationExtras)
this.router.navigate(['dashboard/part'], navigationExtras);
}
零件页面,从 bin (url) 接收参数
ionViewWillEnter() {
this.route.queryParams.subscribe(params => {
console.log('Received on Part Page:', params);
this.pid = params['pid'];
this.fromBin = params['fromBin'];
});
this.database.initDatabase(); // Again, only fires if fresh
this.getPart();
}
然后,从部件返回到 bins 页面:
goBack() {
const navigationExtras = {
queryParams: {
type: this.part.data.type,
}
};
console.log('Go Back To Bins:', this.fromBin, this.part.data.type, navigationExtras);
if (this.fromBin) {
this.router.navigate(['/dashboard/bins'], navigationExtras);
} else {
this.router.navigate(['/dashboard']);
}
}
并从垃圾箱返回仪表板(注意我在这里清除了 queryParams)
goBack() {
const navigationExtras = {}
console.log('Go Back To Dashboard:', navigationExtras);
this.router.navigate(['/dashboard'], navigationExtras);
}
如果我只从仪表板页面开始,一切都会正常工作。我加载到适当的垃圾箱和零件就好了。
TL;DR:问题是当我直接在 bin 页面或部件页面上开始时。如果我直接转到一个 bin 页面(例如 /dashboard/bins?type=antenna),我可以正常导航到仪表板和正确的部件页面,但如果我导航到仪表板并选择另一个 bin,我只会得到即使 URL 中的查询参数已更新,初始 bin 中的部分也是如此。
如果我也直接进入零件页面也会发生这种情况,但另外,如果我返回具有不同 ID 的零件页面,我将看不到其他零件。
我可以看到它没有接收到我通过控制台日志发送的新参数。按顺序,我会看到:
Go To Part {id: "85Xry68VpFN5BMfh9hGu", data: {…}} {queryParams: {…}}
Received on Part Page: {pid: "bHg19fRKW2YNXgzS2Umk", fromBin: "true"}
如您所见,我正在发送 ID85x...
并接收以前的 IDbHg...
此 queryParam 是否被缓存?如果是这样,我该如何销毁它?另外,为什么只有当我直接进入这些子页面时才会发生这种情况?