Pracuję nad projektem Angular. Zmagam się z działaniem odświeżania w komponencie.
Chciałbym odświeżyć komponenty routera po kliknięciu przycisku. Mam przycisk odświeżania, kiedy klikam na niego, komponent / router wymaga odświeżenia.
Spróbowałem window.location.reload()
i location.reload()
te dwa nie są odpowiednie dla moich potrzeb. Proszę o pomoc, jeśli ktoś o tym wie.
angular
routes
components
refresh
Sreehari Ballampalli
źródło
źródło
Odpowiedzi:
Po kilku badaniach i zmodyfikowaniu mojego kodu, jak poniżej, skrypt zadziałał. Właśnie dodałem warunek:
źródło
"your actualComponent"
zmienną. Zmienna jest ustawiana nathis.location.path()
przed wywołaniemnavigateByUrl
. W ten sposób nie ma potrzeby przekazywania żadnych parametrów z wywołującego komponentu ani duplikowania / przekazywania tras.'/'
gdzie/RefrshComponent
jest, a[Your actualComponent"]
Ty po prostu przekażesz adres URL (i / lub parametry), które chcesz przeładować, takie jakthis.router.navigate(["/items"])
. Ten hack zasadniczo przekierowuje do górnego adresu URL, a następnie bardzo szybko z powrotem do zamierzonego adresu URL, który jest niezauważalny dla większości użytkowników i wydaje się być najbardziej eleganckim sposobem na osiągnięcie tego celu.'/'
jako mojej fałszywej trasy, przechodzi ona (przezredirectTo
) do miejsca, w którym mój app-routing.module.ts przekierowuje na ścieżkę''
(pusty ciąg) i zatrzymuje się, nie przechodząc do trasy zakończenia wnavigate()
wywołaniu. Jeśli użyję nieistniejącego ciągu (np./foo
) Jako mojej fałszywej trasy, przechodzi (przezredirectTo
) do miejsca, w którym moja aplikacja-routing.module.ts przekierowuje**
(wszystko inne) i ponownie zatrzymuje się, nie idąc na prawdziwą trasę. Co ciekawe, pasek adresu URL zmienia się na rzeczywistą trasę. Jakieś przemyślenia na temat tego, co tu się różni?Użyj this.ngOnInit (); aby przeładować ten sam komponent zamiast przeładowywać całą stronę !!
źródło
Dodanie tego do kodu do konstruktora wymaganego komponentu działało dla mnie.
Upewnij się, że
unsubscribe
z tego mySubscription wngOnDestroy()
.Więcej informacji można znaleźć w tym wątku - https://github.com/angular/angular/issues/13831
źródło
Na szczęście, jeśli używasz Angular 5.1+, nie musisz już implementować hacka, ponieważ dodano natywną obsługę. Musisz tylko ustawić onSameUrlNavigation na 'przeładowanie' w opcjach RouterModule:
Więcej informacji można znaleźć tutaj: https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
źródło
router.onSameUrlNavigation = 'reload'
właściwości wstrzykniętego routera.onSameUrlNavigation
ma na celu ponowne wezwanie Strażników / Resolwerów, a nie przeładowywanie już rozbitych komponentów. Więcej informacji na ten temat znajdziesz na github.com/angular/angular/issues/21115 . To rozwiązanie będzie działać w przypadku większych, bardziej złożonych aplikacji korzystających z zabezpieczeń / resolwerów, ale zawiedzie w przypadku prostych przykładów.to jest trochę po wyjęciu z pudełka i nie wiem, czy to ci pomoże, czy nie, ale próbowałem
this.ngOnInit();
jest to funkcja, więc każdy kod, który w niej masz, zostanie przywołany tak jak odświeżenie.
źródło
Jeszcze jeden sposób bez wyraźnej trasy:
async reload(url: string): Promise<boolean> { await this.router.navigateByUrl('.', { skipLocationChange: true }); return this.router.navigateByUrl(url); }
źródło
Można to osiągnąć poprzez włamanie, przejdź do jakiegoś przykładowego komponentu, a następnie przejdź do komponentu, który chcesz ponownie załadować.
źródło
W mojej aplikacji mam komponent, a wszystkie dane pochodzą z API, które wywołuję w konstruktorze komponentu. Jest przycisk, za pomocą którego aktualizuję dane mojej strony. po kliknięciu przycisku zapisuję dane w zapleczu i odświeżam dane. Więc przeładowanie / odświeżenie komponentu - zgodnie z moim wymaganiem - jest tylko odświeżeniem danych. jeśli jest to również Twoje wymaganie, użyj tego samego kodu zapisanego w konstruktorze komponentu.
źródło
po prostu zrób to: (dla kątowej 9)
źródło
kdo
źródło
źródło
html
ts plik
źródło
Po prostu zmień routeReuseStrategy z kątowego routera:
Ustaw właściwość routera „navigated” na false:
Następnie przejdź do swojego komponentu:
Następnie przywróć starą / domyślną routeReuseStrategy:
Możesz również wykonać usługę z tego:
źródło
W moim przypadku chciałem
refresh the whole page
zamiast tylko komponentu, więc tak to zrobiłemwindow.location.reload();
źródło
router.navigate['/path']
będzie można dostać się tylko do określonej ścieżkiwykorzystania
router.navigateByUrl('/path')
go przeładowuje całą stronę
źródło
Innym sposobem na odświeżenie (trudny sposób) strony w kątowej 2, takiej jak ten , jest f5
źródło