Czy można mieć opcjonalny parametr trasy w trasie Angular 2? Wypróbowałem składnię Angular 1.x w RouteConfig, ale otrzymałem poniższy błąd:
„ORYGINALNY WYJĄTEK: ścieżka” / user /: id? ”Zawiera znak„? ”, Który nie jest dozwolony w konfiguracji trasy.”
@RouteConfig([
{
path: '/user/:id?',
component: User,
as: 'User'
}])
javascript
angular
Jeroen
źródło
źródło
RouteParams
nie importować do komponentu, sprawdź to: stackoverflow.com/a/36792261/806202 . Rozwiązaniem jest użycieActivatedRoute
:route.snapshot.params['routeParam']
W ten sposób komponent nie jest ponownie renderowany po dodaniu parametru.
źródło
pathMatch: 'full'
do przekierowania, w przeciwnym razie ścieżki takie jakusers/admin
są również przekierowane w moim przypadku/users/all
lub/users/home
przeczytaj „wszystko” lub „dom” jakoid
i po prostu zignoruj, jeśli pasuje do twojej magicznej wartości. Wtedy pierwsza linia powyżej stanie sięredirectTo: 'users/home'
lub cokolwiek zdecydujesz. Dla mnie ukośnik naprawdę wyróżnia się jako coś złego.Zaleca się użycie parametru zapytania, gdy informacje są opcjonalne.
z https://angular.io/guide/router#optional-route-parameters
Wystarczy wyjąć parametr ze ścieżki trasy.
źródło
Kątowe 4 - Rozwiązanie dotyczące zamawiania opcjonalnego parametru:
ZRÓB TO:
Zwróć uwagę, że trasy
products
iproducts/:id
mają dokładnie takie same nazwy. Angular 4 będzie poprawnie podążałproducts
za trasami bez parametru, a jeśli parametr będzie podążałproducts/:id
.Jednak ścieżka dla trasy
products
nieparametrowej nie może mieć końcowego ukośnika, w przeciwnym razie angular niepoprawnie potraktuje ją jako ścieżkę parametru. Więc w moim przypadku miałem końcowy ukośnik dla produktów i nie działał.NIE ROBIĆ TEGO:
źródło
data
do komponentu, który może być inny dla każdej trasy, nawet do tego samego komponentu. Przykład{path: 'products', component: ProductsComponent, data: { showAllProducts: true} },
może zostać użyty, a następnie sprawdźshowAllProducts
. Trochę ładniej niż sprawdzanie wartości null, ale w prostszych przypadkach jedno i drugie prawdopodobnie jest w porządku.odpowiedź rerezz jest całkiem niezła, ale ma jedną poważną wadę. Powoduje
User
to ponowne uruchomieniengOnInit
metody przez komponent .Może to być problematyczne, gdy robisz tam ciężkie rzeczy i nie chcesz, aby były ponownie uruchamiane, gdy przełączasz się z trasy nieparametrycznej na parametryczną. Chociaż te dwie trasy mają imitować opcjonalny parametr adresu URL, a nie stać się dwoma oddzielnymi trasami.
Oto, co proponuję, aby rozwiązać problem:
Następnie możesz przenieść logikę odpowiedzialną za obsługę parametru do
UserWithParam
komponentu i pozostawić logikę podstawową wUser
komponencie. Cokolwiek zrobiszUser::ngOnInit
, nie zostanie uruchomione ponownie, gdy przejdziesz z / user do / user / 123 .Nie zapomnij umieścić znaku
<router-outlet></router-outlet>
wUser
szablonie.źródło
Sugerowane odpowiedzi tutaj, w tym zaakceptowana odpowiedź z ponownego odtworzenia, która sugeruje dodanie wielu wpisów trasy, działają dobrze.
Jednak komponent zostanie odtworzony podczas zmiany między wpisami trasy, tj. Między wpisem trasy z parametrem a wpisem bez parametru.
Jeśli chcesz tego uniknąć, możesz utworzyć własny element dopasowujący trasę, który będzie pasował do obu tras:
Następnie użyj dopasowania w konfiguracji trasy:
źródło
W angular4 musimy po prostu zorganizować trasy razem w hierarchii
To działa dla mnie. W ten sposób router wie, jaka jest następna trasa na podstawie parametrów id opcji.
źródło
Wpadłem na inny przykład tego problemu i szukając rozwiązania przyszedł tutaj. Mój problem polegał na tym, że robiłem dzieci i leniwe ładowanie komponentów, aby trochę zoptymalizować. Krótko mówiąc, jeśli jesteś leniwy podczas ładowania modułu nadrzędnego. Najważniejsze było to, że użyłem „/: id” w trasie i narzekałem, że „/” jest jej częścią. Nie jest to dokładny problem, ale dotyczy.
Routing aplikacji od rodzica
Trasy podrzędne są ładowane z opóźnieniem
źródło
Nie mogę komentować, ale w odniesieniu do: opcjonalnego parametru trasy w Angular 2
aktualizacja dla Angular 6:
Więcej informacji na temat routingu Angular6 można znaleźć pod adresem https://angular.io/api/router/ActivatedRoute .
źródło
W obliczu podobnego problemu z leniwym ładowaniem zrobiłem to:
A potem w komponencie:
Tą drogą:
Trasa bez
/
jest przekierowywana na trasę z. Z tego powodupathMatch: 'full'
przekierowywana jest tylko taka konkretna pełna trasa.Następnie
users/:id
jest odbierany. Jeśli rzeczywista trasa byłausers/
,id
jest""
, sprawdź jąngOnInit
i postępuj zgodnie z nią; w przeciwnym razieid
jest id i kontynuuj.Reszta składnika, na który działa,
selectedUser
jest lub nie jest nieokreślona (* ngIf i tym podobne).źródło