Es gibt eine Problemumgehung für die Verwendung sekundärer Routen, da Angular diese über die primäre Routennavigation hinweg beibehält.
Fügen Sie zunächst einen benannten Router-Ausgang in Ihre oberste Komponente ein:
<router-outlet name="params"><router-outlet>
Erstellen Sie als Nächstes eine Dummy-Komponente, an die weitergeleitet werden soll:
@Component({
template: ""
})
export class ParamsComponent {}
und definieren Sie eine Route, um diese Komponente in den genannten Ausgang zu instanziieren:
{
path: ':val1',
component: ParamsComponent,
outlet: "params"
}
Ändern Sie Ihre App-Navigation in:
https://my.application.com/(params:val1)
Wenn Sie sich eine ActivatedRoute ansehen, können Sie die "params" -Route finden, indem Sie:
var paramsRoute = this.activatedRoute.route.children.find(r => r.outlet == "params");
Wenn paramsRoute null ist, enthält die URL nicht das (params: val1).
Dieser nächste Teil wird etwas "hackig", da die sekundäre Route beim ersten Laden nach der primären Route instanziiert wird. Aus diesem Grund ist paramsRoute.snapshot möglicherweise null, bis Ihre App vollständig geladen ist. Es gibt eine private Eigenschaft "_futureSnapshot", die die Routenparameter beim ersten Start enthält ... und während der gesamten Lebensdauer der App erhalten bleibt. Sie können diese erreichen, indem Sie:
var queryParams =
paramsRoute
? paramsRoute["_futureSnapshot"].params
: {};
var val1 = queryParams["val1"];
Da _futureSnapshot nicht Teil der öffentlichen API ist, ist dies wahrscheinlich ein Feld, das wir nicht verwenden sollten. Wenn Sie Schwierigkeiten haben, es zu verwenden, könnten Sie wahrscheinlich paramsRoute.params abonnieren, aber dies wird Ihre Komponenten wahrscheinlich komplizieren.
if (paramsRoute) {
paramsRoute.params.subscribe(params => {
this.queryParams = params;
this.loadData();
});
} else {
this.queryParams = {};
this.loadData();
}
========= ÄNDERUNG ==============
Ich habe einen noch besseren Weg gefunden, um die Abfrageparameter abzurufen, der definitiv NICHT icky ist ... Fügen Sie in einer Komponente oder einem Dienst, der vor dem Routing instanziiert wird, die folgende Logik hinzu:
const routeRecognizedSubscription = this.router.events
.filter(e => e instanceof RoutesRecognized)
.subscribe((e: RoutesRecognized) => {
const paramsRoute = e.state.root.children.find(r => r.outlet == "params");
if (paramsRoute) {
// capture or use paramsRoute.params
}
routeRecognizedSubscription.unsubscribe();
});
Dieser Code abonniert vorübergehend RoutesRecognized-Ereignisse, die vor der Navigation auftreten. Nachdem das erste Ereignis empfangen wurde, wird es automatisch abgemeldet, da dies nur beim Starten der App erforderlich ist.
Beim ersten Ereignis suchen wir nach dem Status, der dem Ausgang "params" entspricht. Wenn gefunden, enthält die Eigenschaft params die Daten, die wir benötigen. Sie müssen nicht auf private Immobilien zugreifen.