Wie bekommt man Daten von der Route oder ActivatedRoute bei der Anmeldung an den router.Veranstaltungen.subscribe in Angular2?
Ich versuche, die Daten von einem Router, wenn sich die Route ändert, aber ich bin nicht mit Erfolg. Hier habe ich den asdf
Eigenschaft
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
LoginComponent,
DashboardComponent,
OverviewComponent,
],
imports: [
BrowserModule,
FormsModule,
RouterModule.forRoot([
{ path: '', pathMatch: 'full', redirectTo: '' },
{ component: LoginComponent, path: 'login' },
{
children: [
{ path: '', pathMatch: 'full', redirectTo: 'overview', data: { asdf: 'hello' } },
{ component: OverviewComponent, path: 'overview', data: { asdf: 'hello' } },
], component: DashboardComponent,
path: '',
},
]),
],
})
export class AppModule { }
Und hier bekomme ich die URL vom router, wenn sich die route ändert, aber asdf
ist nicht definiert 🙁
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { ActivatedRoute, NavigationEnd } from '@angular/router';
@Component({
selector: 'cs-map',
styleUrls: ['map.component.css'],
templateUrl: 'map.component.html',
})
export class MapComponent implements OnInit {
private routerSub;
constructor(private router: Router, private activatedRoute: ActivatedRoute) { }
public ngOnInit() {
this.router.events.subscribe((val) => {
if (val instanceof NavigationEnd) {
let url = val.url;
console.log(this.activatedRoute.snapshot.data['asdf']); //data is defined but asdf is not :(
}
});
}
}
Wie bekomme ich asdf
's Wert?
Edit: ich bin mit der Navigation zu /overview
- Ich denke, das ist ein bekanntes Problem. Können Sie versuchen, mit
setTimeout(() => console.log(this.activatedRoute.snapshot.data['asdf']))
? - leider hat es nicht funktioniert
- Es gab eine ähnliche Frage heute, wo jemand schlug die Verwendung
Observable.zip()
mitthis.activatedRoute.snapshot.data
undthis.router.events
. - Meinst du diese?: github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/...
- Genau . . . . . . .
- Muss ich ersetzen Sie den router.Veranstaltungen.abonnieren mit Observable.zip? Ich bin mir nicht genau sicher, wie Sie Sie von hier aus gehen
- Ich weiß es nicht. Ich habe gerade gesehen es erwähnt, auf eine ähnliche Frage. Ich bin nicht mit TS mich und keine tiefen Kenntnisse über observablen.
- Np, danke tho 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ohne während Schleife
router
ich filter nurNavigationEnd
Ereignis, dann habe ich die Karte dieses Ereignis, um dieactivatedRoute
(weil ich Lesen möchte, den Wert vonactivatedRoute
aufNavigationEnd
). Ich anzeigen dieactivatedRoute
zu denfirstChild
(erste Kinder erklärt mitRouterModule.forRoot()
). Dann einswitchMap
gemacht wird, um die Daten von dieser Strecke, eine switchMap, weil Daten zu beobachten. Schließlich habe ich die Kartedata
Objekt, um den Schlüssel, den ich will, in diesem Fallasdf
Property 'filter' does not exist on type 'Observable<Event>'
es ist wahrscheinlich, weil der Winkel 6 und rxjs 6 ändern. könnte Sie post aktualisiert-code?Folgenden wird aktualisiert, um die Arbeit mit rxjs v6
Hier ist ein modifiziertes Beispiel mit @Neelavar link Beispiel.
Er sieht zwar lang, aber es ist einfach, geduldig zu sein, wenn du dich durch es, es sollte funktionieren. Einfach die folgenden Schritte sollte ein paar Minuten dauern.
Vollständige Erklärung für mein setup, für Anfänger
Man sollte schon wissen, wie zum erstellen von Komponenten und setup-routing, kann ich nicht erklären, dass in die Tiefe.
1. Setup-Daten-Eigenschaft in Routen Array
Ihre Routen array (finden Sie diese entweder in app.- Modul.ts oder app-Routen.- Modul.ts oder in einigen Fällen Routen.ts - Datei).
Wenn Sie nicht finden können, diese, überprüfen Sie grundlegende routing-setup:
- Winkel-docs
- eine video-als auch
eine grundlegende setup ist alles, was Sie brauchen!
Fügen Sie die data-Eigenschaft so (Sie benötigen, um zu generieren, die home-Komponente):
2. Erstellen Sie eine Klasse
RouteData.ts, habe ich es in den gleichen Ordner Platz als app.- Modul.ts
Dies ist nur zum hinzufügen von Arten für die Verwendung des beobachtbaren, im Typoskript, die IDE kann dann AutoVervollständigen "title" oder "id" oder "animation" für mich, wenn ich hinzufügen, dass die Daten-Klasse höher.
3. Importieren Sie den folgenden in-app.Komponente.ts
Dann über die Konstruktor code, deklarieren Sie die variable
Dann innerhalb der Konstruktor
4. Dann innerhalb ngOnInit
Erläuterung der code angepasst von @Tuizi link Beispiel Kommentar:
Für jedes Ereignis, von der router-filter nur für die NavigationEnd Veranstaltung (wenn der router beendet die navigation).
Dann anzeigen (return) der derzeit activatedRoute.
Karte der activatedRoute die firstChild (Das erste Kind dieser route in den router-Status-Baum).
Dann ein switchMap gibt die Daten von dieser route, verwenden eine switchMap, weil jedes "data", die ausgegeben wird, ist eine observable, die Karte wechseln, wird das Abbrechen der alten beobachtbar, wenn ein neues emittiert wird, spart Speicher.
Anzeigen (return) - Daten-Objekt, weisen Sie ihm eine Art von RouteData.
Schließlich können Sie das Beobachtbare in eine Vorlage mit async-Rohr
*Hinweis: "async " als" Pausen-Typ Check-in die Vorlage im moment 🙁
github issue
Daten in den Routen muss ein array von Objekten, anstatt nur Objekt so definieren Sie wie folgt
Nun, um es abzurufen, verwenden Sie diesen code in Ihre Komponenten Konstruktor
export declare type Data = { [name: string]: any; };
Data
die aliasdata
ist der Typany
werden kann ein array auch. aber wenn Sie sich an den router.Ereignisse und überprüfen Sie auf die Art, die Sie sehen, dass es eine arraay