web-dev-qa-db-de.com

Löschen Sie alle queryParams mit dem neuen Router v3 Angular2

Ich versuche, herauszufinden, wie die Angular2-Routernavigation (Router 3.0.0-alpha.7) mit Abfrageparametern verwendet wird.

Ich kann mit dieser Zeile leicht zu einer Route mit einem queryParam navigieren:

this._router.navigate(['/login'], {queryParams: {redirect: 'route1'}});

In der Komponente '/ login' führe ich einige Anmeldungen durch, die auf die redirect-Route, hier Route1, umleiten. Nach der Umleitung verbleiben jedoch die Abfrageparameter redirect in der URL, d. H. Ich befinde mich jetzt auf Seite /route1?redirect=route1. Ich möchte den Umleitungsparameter hier entfernen.

Wenn ich dann zu einer anderen Seite mit derselben redirect queryParam navigiere, wird die vorherige Seite nicht überschrieben, sondern ein weiterer ?redirect=... in der URL hinzugefügt. Nämlich:

this._router.navigate(['/another-route'], {queryParams: {redirect:'route2'}});

führt mich zu /another-route?redirect=route2?redirect=route1

Ist es möglich, die queryParams zu löschen, wenn Sie zwischen Routen navigieren? Ich habe this._router.navigate(['/route1'], {queryParams: {redirect: null}}); oder {queryParams: null} etc versucht, aber kein Erfolg.

17
amaurymartiny

Ich habe auch damit zu kämpfen. Sie würden erwarten, dass der Router die Abfrageparameter standardmäßig löscht, wenn Sie zu einer anderen Route navigieren ... 

Sie können entweder tun

this._router.navigate(['/route1'], {queryParams: {}});

oder

this._router.navigateByUrl('/route1');

oder bei Verwendung von routerLink:

<a [routerLink]="['/applications']" [queryParams]="{}"> Applications</a>
21
yarons

Eigentlich ... sollten Sie NICHT "erwarten, dass der Router die Abfrageparameter löscht".

Natürlich erwarten Sie das auch. Dies liegt jedoch daran, dass Sie keine wichtige Entscheidung für das Router-Design kennen ... wahrscheinlich, weil leider wir haben Sie noch nicht in den Dokumenten erwähnt}. Wir arbeiten jetzt daran, das zu korrigieren.

QueryParams sind für Parameter, die in allen Navigationen global sind; sie ändern sich nicht.

MatrixParams sind für Parameter, die zur aktuellen Navigation gehören; diese ändern sich.

Was gehört in globale QueryParams? Sachen, die vom Server kommen, sind Kandidaten. Wie Auth-Token, die zu jeder Interaktion gehören.

Erforderliche route-Parameter (der :id in customer/:id) und optionale Matrixparameter (wie der ;name=Jo* in /customers;name=Jo*) sind lokal für eine Navigation. So können Sie eine Navigation für Kunden mit einem optionalen Namensfilter angeben. 

Unabhängig davon, ob Sie mit diesem Ansatz einverstanden sind oder nicht, ist dies für das Design des Routers v.3 von grundlegender Bedeutung.

Ich schlage vor, Ihre Erwartungen anzupassen, anstatt sie zu bekämpfen. 

7
Ward

Sie können dies versuchen: 

this.router.navigate (['target'], {preserveQueryParams: false});

0
Dracarys