🎉
Angular で画面を Reload せずにクエリパラメータを変える
http://localhost:4200/#/list?q=あいう
という URL であるとき、検索ワードを「かきく」に変えたら URL も http://localhost:4200/#/list?q=かきく
に変わって欲しい、を実現するやつ。
// private router: Router
// private route: ActivatedRoute
this.router.navigate([], {
relativeTo: this.route,
queryParams: { q: 'かきく' },
queryParamsHandling: 'merge',
replaceUrl: true
});
これで OK.
History.replaceState() でも実現できるけど、replaceState() は Angular の外の世界を変える手法であり、それは Angular の中にも副作用があるかも。
実際、Angular の scrollPositionRestoration の挙動確認と、最適なヘッダー/フッターレイアウトの模索 | Experiments Never Fail で試した「ブラウザの戻る(history.back()) 時に、以前のY座標(top)を復元しようとする」は、History.replaceState()
で URL を変えた後で Back したら効かなかった。
ので、Angular が提供する機能で行えるならできるだけそうしましょう。
Discussion