Chcę wykryć zmianę trasy w mojej AppComponent
.
Następnie sprawdzę globalny token użytkownika, aby sprawdzić, czy jest on zalogowany. Następnie mogę przekierować użytkownika, jeśli nie jest zalogowany.
W Angular 2 możesz subscribe
(zdarzenie Rx) do instancji routera. Możesz więc robić takie rzeczy jak
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
Edytuj (od rc.1)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
Edycja 2 (od 2.0.0)
patrz także: Router.events doc
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
event._root.children[0].value._routeConfig.data
mam nadzieję, że może być lepszy sposóbfilter
operatora RxJS .router.events.pipe(filter(e => e instanceof NavigationEnd).subscribe((e) => { ... }
RxJS 6
Dzięki Peilonrayz (patrz komentarze poniżej)
nowy router> = RC.3
Możesz również filtrować według danego zdarzenia:
Dobrym pomysłem jest także skorzystanie z
pairwise
operatora w celu uzyskania poprzedniego i bieżącego wydarzenia. https://github.com/angular/angular/issues/11268#issuecomment-244601977źródło
Argument of type '(event: Event) => void' is not assignable to parameter of type
Argument of type '(event: Event) => void' is not assignable to parameter of type
błąd polega na tym, że we fragmencie filtra subskrybujesz obiekt typu Event zamiast NavigationEvent.W Angular 7 ktoś powinien napisać:
this.router.events.subscribe((event: Event) => {})
Szczegółowy przykład może wyglądać następująco:
źródło
Kątowe 7 , jeśli chcesz
subscribe
, abyrouter
źródło
Kątowy 4.xi wyższy:
Można to osiągnąć za pomocą właściwości url klasy ActivatedRoute, jak poniżej,
Uwaga: Musisz zaimportować i wstrzyknąć dostawcę z
angular/router
paczkii
źródło
Router 3.0.0-beta.2 powinien być
źródło
W kątach 6 i RxJS6:
źródło
import {Router, NavigationEnd} from "@angular/router"
Odpowiedzi tutaj są poprawne dla
router-deprecated
. Najnowsza wersjarouter
:lub
Aby zobaczyć różnicę między nimi, sprawdź to SO pytanie .
Edytować
Najpóźniej musisz zrobić:
źródło
router
Został ponownie zaktualizowany (I nie zostały zaktualizowane jeszcze moją odpowiedź), więc nie jestem pewien, jak to jest ostatni. W przypadkurouter
, o którym pisałem, nie można. @aknW Angular 8 powinieneś to lubić
this.router.events.subscribe((event: Event) => {})
Przykład:
źródło
W komponencie możesz spróbować tego:
źródło
źródło
Lokalizacja działa ...
źródło
powyżej większość rozwiązań jest poprawnych, ale mam do czynienia z problemem, który emituje wiele razy zdarzenie „Emituj nawigację”. kiedy zmieniłem dowolną trasę, to zdarzenie jest wyzwalane. Więc usłysz to kompletne rozwiązanie dla Angulara 6.
źródło
Odpowiedź @Ludohen jest świetna, ale jeśli nie chcesz używać,
instanceof
skorzystaj z poniższychw ten sposób możesz sprawdzić nazwę bieżącego zdarzenia jako ciąg znaków, a jeśli zdarzenie wystąpiło, możesz zrobić to, co zaplanowałeś.
źródło
Event
typ powoduje błąd w Atomie, dlatego go nie użyłeminstanceOf
aby twój przykład działał również w kodzie produkcyjnym.if(event instanceOf NavigationStart) {
if(event instanceof NavigationStart)
Pracuję z aplikacją angular5 i mam ten sam problem. kiedy przeglądam Dokumentację kątową, zapewniają najlepsze rozwiązanie do obsługi zdarzeń routera. sprawdź następującą dokumentację.
Zdarzenia routera w Angular Zdarzenia trasy w angular5
Ale specjalnie dla przypadku, o którym mowa, potrzebujemy zdarzenia NavigationEnd
Nawigacja End Event Angular
Jak tego użyć?
Kiedy tego użyć?
W moim przypadku moja aplikacja ma wspólny pulpit nawigacyjny dla wszystkich użytkowników, takich jak użytkownicy, administratorzy, ale muszę pokazać i ukryć niektóre opcje paska nawigacyjnego zgodnie z typami użytkowników.
Dlatego za każdym razem, gdy zmienia się adres URL, muszę wywołać metodę usługi, która zwraca zalogowane informacje o użytkowniku zgodnie z odpowiedzią, idę do dalszych operacji.
źródło
Poniższy RODZAJ prac i może zrobić dla ciebie podstęp.
Niestety przekierowuje to później w procesie routingu, niż chciałbym. The
onActivate()
Oryginalnego komponentu docelowego nazywa się przed przekierowaniem.Tam jest
@CanActivate
dekorator, którego można użyć na komponencie docelowym, ale jest to a) nie scentralizowane i b) nie korzysta z wstrzykiwanych usług.Byłoby wspaniale, gdyby ktokolwiek mógł zasugerować lepszy sposób centralnego autoryzowania trasy przed jej zatwierdzeniem. Jestem pewien, że musi być lepszy sposób.
To jest mój bieżący kod (Jak mógłbym go zmienić, aby słuchać zmiany trasy?):
źródło
Tak robię od RC 5
źródło
Po prostu wprowadź zmiany w AppRoutingModule, takie jak
źródło
Kątowy 8. Sprawdź, czy bieżąca trasa jest trasą bazową .
źródło
Napisałbym coś takiego:
źródło
prosta odpowiedź na Angular 8. *
źródło