Angular 4内のさまざまなタイプのルーティングで複数のスレッド/質問を検索した後、queryParamsをAngular 4ルートに渡すことに関連する問題を解決できません。
どちらかをURLに渡すとき
http://localhost/search;x=y
テンプレートを介して[queryParams] = {x: 'y'}
<a [routerLink]="/search" [queryParams]="{x: 'y'}">Navigate</a>
またはコンポーネントクラス内
this._router.navigate(['/search'], { queryParams: {x: 'y'} });
その結果、ルーターは一致エラーをスローします。
Error: Cannot match any routes. URL Segment: 'search%3Fparam1%3Dtest1%26param2%3Dtest2'
EnableTracingをtrueに設定すると、疑わしい文字がナビゲーションでエンコードされていることがわかります。これはおそらく、照合に失敗した理由です。
QueryParamsを含むurlを処理し、それらをapi呼び出し用に解析する必要があるため、query param routeは必須またはオプションのparamsよりも使用する必要があります。
誰もが同様の問題を抱えていますか?
いくつかの審議の後、私は問題を修正することができました。
ActivatedRouteSnapshotを使用してURL(クエリパラメーターを含む)を全体として保存し、それをルーターに渡していました。
ルートへの別のオブジェクトにクエリパラメータを保存し、使用して渡す必要がありました
this._router.navigate(['/search'], { queryParams: paramsObj });
もちろん、文字列の最後に追加されたすべてのクエリパラメータを持つルートを一致させることができなかったため、ルートマッチングは失敗しました。
次のコードは私を救った:
this.router.navigate(['route-name'], { queryParams: {key:'value'} });
受信側で次の方法で値を取得します(ActivatedRouteが挿入されたと仮定します)。
this.route.queryParams.subscribe(params => {console.log(queryParams['key'])}
または、テンプレートレベルで次のように記述できます。
**<a [routerLink]="['/login']" [queryParams]="{ key: 'employer'}" >sign in</a></p>**
注:ルートはActivatedRouteのインスタンスです。
たとえば、変数を使用して検索ページにリダイレクトするリンクを追加します:searchString = 'search'
_<a [routerLink]="['/search', searchString]">Navigate</a>
_
コンポーネントでは、this._router.navigate(['/search', this.searchString]);
を使用してナビゲーションを作成できます。どちらの場合でもsearchStringはconstとして宣言されます。