Używam angular 2 ze strategią hashlocation.
Komponent jest ładowany tą trasą:
"departments/:id/employees"
Jak dotąd dobrze.
Po pomyślnym zapisaniu partii wielu edytowanych wierszy tabeli chcę ponownie załadować bieżący adres URL trasy za pośrednictwem:
this.router.navigate([`departments/${this.id}/employees`]);
Ale nic się nie dzieje, dlaczego?
Odpowiedzi:
Jeśli funkcja navigate () nie zmienia adresu URL, który jest już wyświetlany na pasku adresu przeglądarki, router nie ma nic do zrobienia. Odświeżanie danych nie jest zadaniem routera. Jeśli chcesz odświeżyć dane, utwórz usługę wstrzykniętą do komponentu i wywołaj funkcję ładowania w usłudze. Jeśli nowe dane zostaną pobrane, zaktualizuje widok za pomocą powiązań.
źródło
Można to teraz zrobić w Angular 5.1 przy użyciu
onSameUrlNavigation
właściwości konfiguracji routera.Dodałem blog wyjaśniający, jak tutaj, ale istota jest następująca
https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
W
onSameUrlNavigation
opcji włączania konfiguracji routera , ustawiając ją na'reload'
. Powoduje to, że router uruchamia cykl zdarzeń, gdy próbujesz nawigować do już aktywnej trasy.W definicjach tras ustaw
runGuardsAndResolvers
naalways
. To powie routerowi, aby zawsze uruchamiał cykle strażników i resolwerów, uruchamiając powiązane zdarzenia.Wreszcie, w każdym komponencie, który chcesz włączyć przeładowywanie, musisz obsłużyć zdarzenia. Można to zrobić, importując router, wiążąc się ze zdarzeniami i wywołując metodę inicjalizacji, która resetuje stan komponentu i ponownie pobiera dane, jeśli jest to wymagane.
Po wykonaniu wszystkich tych czynności należy włączyć ponowne ładowanie tras.
źródło
init
funkcji,init
?Utwórz w kontrolerze funkcję, która przekierowuje do oczekiwanej trasy w ten sposób
następnie użyj tego w ten sposób
ta funkcja przekieruje do fałszywej trasy i szybko wróci do trasy docelowej bez wiedzy użytkownika.
źródło
'/'
zamiast'/DummyComponent'
EDYTOWAĆ
W przypadku nowszych wersji Angulara (5.1+) użyj odpowiedzi sugerowanej przez @Simon McClive
Stara odpowiedź
Znalazłem to obejście w żądaniu funkcji GitHub dla Angular:
Próbowałem dodać to do mojej funkcji app.component.ts
ngOnInit
i na pewno zadziałało. Wszystkie kolejne kliknięcia tego samego łącza powodują teraz ponowne załadowaniecomponent
danych i.Link do oryginalnej prośby o funkcję GitHub
Kredyt trafia do mihaicux2 na GitHub.
Przetestowałem to na wersji
4.0.0-rc.3
zimport { Router, NavigationEnd } from '@angular/router';
źródło
Trochę trudne: użyj tej samej ścieżki z niektórymi fikcyjnymi parametrami. Na przykład-
źródło
this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });
iroute.queryParams.subscribe(val => myRefreshMethod())
gdzieroute: ActivatedRoute
jest wstrzykiwany w odświeżonym komponencie ... Mam nadzieję, że to pomagaUżywam tego dla projektu Angular 9:
PS: Przetestowano i działa również na „Angular 7, 8”
źródło
Przeładowanie trasy Angular 2-4
Dla mnie użycie tej metody wewnątrz komponentu głównego (komponentu, który jest obecny na dowolnej trasie) działa:
źródło
To działa na mnie jak urok
źródło
Po zmianie parametrów strona przeładowania nie nastąpi. To naprawdę dobra funkcja. Nie ma potrzeby przeładowywania strony, ale powinniśmy zmienić wartość komponentu. paramChange wywoła zmianę adresu URL. Więc możemy zaktualizować dane komponentów
źródło
To właśnie zrobiłem w Angular 9 . Nie jestem pewien, czy to działa w starszych wersjach.
Będziesz musiał to wywołać, gdy będziesz musiał ponownie załadować.
Router forRoot musi mieć ustawioną opcję SameUrlNavigation na „przeładowanie”
Każda Twoja trasa musi mieć ustawienie runGuardsAndResolvers na „zawsze”
źródło
U mnie pracuje na sztywno z
źródło
O ile wiem, nie można tego zrobić z routerem w Angular 2. Ale możesz po prostu zrobić:
Aby ponownie załadować widok.
źródło
Znalazłem szybkie i proste rozwiązanie, które nie wymaga majstrowania przy wewnętrznych funkcjach kątowych:
Zasadniczo: po prostu utwórz alternatywną trasę z tym samym modułem docelowym i po prostu przełączaj się między nimi:
A tu menu łączone:
Mam nadzieję, że to pomoże :)
źródło
Trochę hardcore, ale
źródło
W moim przypadku:
działa poprawnie
źródło
zaimplementuj OnInit i wywołaj ngOnInit () w metodzie route.navigate ()
Zobacz przykład:
źródło
Rozwiązano podobny scenariusz przy użyciu fikcyjnego komponentu i trasy dla
reload
, który w rzeczywistości wykonuje plikredirect
. To zdecydowanie nie obejmuje wszystkich scenariuszy użytkowników, ale po prostu działało w moim scenariuszu.Routing jest połączony przewodowo, aby przechwytywać wszystkie adresy URL za pomocą symbolu wieloznacznego:
Aby z tego skorzystać, wystarczy dodać reload do adresu URL, do którego chcemy się udać:
źródło
Istnieją różne podejścia do odświeżania bieżącej trasy
Zmień zachowanie routera (od wersji Angular 5.1) Ustaw routery onSameUrlNavigation na „przeładuj”. Spowoduje to wyemitowanie zdarzeń routera w tej samej nawigacji URL.
Pozostaw router nietknięty
Bardziej szczegółowe wyjaśnienie napisałem pod https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e
Mam nadzieję że to pomoże.
źródło
Załóżmy, że trasa komponentu, którą chcesz odświeżyć, to
view
, a następnie użyj tego:możesz dodać
debugger
wewnątrz metody, aby wiedzieć, jaka jest dokładna trasa, do której dojdzie po nawigacji"departments/:id/employees"
.źródło
Rozwiązaniem jest przekazanie fikcyjnego parametru (tj. Czasu w sekundach), w ten sposób link jest zawsze przeładowywany:
źródło
Używam
setTimeout
inavigationByUrl
rozwiązuję ten problem ... I dla mnie działa dobrze.Jest przekierowywany na inny adres URL i zamiast tego pojawia się ponownie w bieżącym adresie URL ...
źródło
Uważam, że zostało to rozwiązane (natywnie) w Angular 6+; czek
tutaj https://github.com/angular/angular/issues/13831 &&
i tutaj https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
Ale to działa dla całej trasy (obejmuje również wszystkie trasy dla dzieci)
Jeśli chcesz kierować reklamy na pojedynczy komponent, wykonaj następujące czynności: Użyj zmieniającego się parametru zapytania, aby móc nawigować dowolną liczbę razy.
W punkcie nawigacji (klasa)
W komponencie, który chcesz „odświeżyć / załadować ponownie”
źródło
Bardzo frustrujące jest to, że Angular nadal nie zawiera dobrego rozwiązania. Podniosłem tutaj problem z githubem: https://github.com/angular/angular/issues/31843
W międzyczasie to jest moje obejście. Opiera się na niektórych innych rozwiązaniach sugerowanych powyżej, ale myślę, że jest trochę bardziej wytrzymały. Obejmuje zawinięcie usługi Routera w znak „
ReloadRouter
”, który zajmuje się funkcją przeładowania, a także dodajeRELOAD_PLACEHOLDER
do podstawowej konfiguracji routera. Służy do tymczasowej nawigacji i pozwala uniknąć wyzwalania innych tras (lub strażników).Uwaga: używaj tylko
ReloadRouter
w tych przypadkach, gdy chcesz mieć funkcję przeładowania. WRouter
przeciwnym razie użyj normalnego .źródło
Importuj
Router
iActivatedRoute
z@angular/router
Wstrzyknij
Router
iActivatedRoute
(jeśli potrzebujesz czegoś z adresu URL)W razie potrzeby pobierz dowolny parametr z adresu URL.
Użycie sztuczki, przechodząc do fałszywego lub głównego adresu URL, a następnie do rzeczywistego adresu URL, odświeży komponent.
W Twoim przypadku
Jeśli korzystasz z fikcyjnej trasy, zobaczysz migający tytuł „Nie znaleziono”, jeśli zaimplementowałeś nie znaleziony adres URL w przypadku, gdy nie pasuje do żadnego adresu URL.
źródło
zasubskrybuj zmiany parametrów trasy
źródło
Jeśli zmieniasz trasę przez łącze routera, wykonaj następujące czynności:
źródło
Należy użyć właściwości „onSameUrlNavigation” w module RouterModule, a następnie zasubskrybować Zdarzenia trasy https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e
źródło
Decyduje, kiedy trasa powinna być przechowywana. Return false to
i ustaw wartość nawigowaną routera na false, co oznacza, że ta trasa nigdy nie była trasowana
źródło
Wypróbowałem kilka poprawek i żadna z nich nie działa. Moja wersja jest prosta: dodaj nowy nieużywany parametr do parametrów zapytania
źródło
window.location.replace
// użyj lewego klawisza, aby zawrzeć trasę
window.location.replace (
departments/${this.id}/employees
)źródło