Używam angular2.0.0-beta.7. Gdy składnik jest ładowany na ścieżkę, tak jak /path?query=value1
jest przekierowywany /path
. Dlaczego usunięto parametry GET? Jak mogę zachować parametry?
Mam błąd w routerach. Jeśli mam główną trasę jak
@RouteConfig([
{
path: '/todos/...',
name: 'TodoMain',
component: TodoMainComponent
}
])
i moja droga dziecka jak
@RouteConfig([
{ path: '/', component: TodoListComponent, name: 'TodoList', useAsDefault:true },
{ path: '/:id', component: TodoDetailComponent, name:'TodoDetail' }
])
wtedy nie mogę uzyskać parametrów w TodoListComponent. Jestem w stanie zdobyć
params("/my/path;param1=value1;param2=value2")
ale chcę klasykę
query params("/my/path?param1=value1¶m2=value2")
typescript
angular
FireGM
źródło
źródło
@RouteConfig
topath
?Odpowiedzi:
Przez wstrzyknięcie wystąpienia
ActivatedRoute
można subskrybować różne obserwowalne, w tym aqueryParams
iparams
obserwowalne:UWAGA DOTYCZĄCA BRAKU SUBSKRYPCJI
@Reto i @ codef0rmer całkiem słusznie zauważyli, że zgodnie z oficjalnymi dokumentami metoda
unsubscribe()
wewnątrz składników nieonDestroy()
jest w tym przypadku konieczna. Zostało to usunięte z mojej próbki kodu. (patrz niebieskie pole ostrzeżenia w tym samouczku)źródło
The Router manages the observables it provides and localizes the subscriptions. The subscriptions are cleaned up when the component is destroyed, protecting against memory leaks, so we don't need to unsubscribe from the route params Observable.
Gdy adres URL taki jak ten http://stackoverflow.com?param1=value
Możesz pobrać param1 po kodzie:
źródło
Chociaż pytanie określa wersję beta 7 , to pytanie pojawia się również jako najlepszy wynik wyszukiwania w Google dla typowych wyrażeń, takich jak parametry zapytania kątowego 2 . Z tego powodu oto odpowiedź na najnowszy router (obecnie w wersji alfa 7 ).
Sposób odczytu parametrów zmienił się diametralnie. Najpierw musisz wstrzyknąć zależność wywoływaną
Router
w parametrach konstruktora, takich jak:a potem możemy zasubskrybować parametry zapytania w naszej
ngOnInit
metodzie (konstruktor też jest w porządku, alengOnInit
powinien być użyty do testowania) jakW tym przykładzie czytamy identyfikator parametru zapytania z adresu URL typu
example.com?id=41
.Wciąż pozostaje kilka rzeczy do zauważenia:
params
likeparams['id']
zawsze zwraca ciąg , który można przekonwertować na liczbę , poprzedzając go znakiem+
.źródło
if (params.hasOwnProperty('id')) { this.selectedId = params['id'] } else { this.selectedId = params['identification']}
.Bardzo podobała mi się odpowiedź @ StevePaula, ale możemy zrobić to samo bez zbędnego połączenia z subskrypcją / anulowaniem subskrypcji.
źródło
Aby wysłać parametry zapytania
Aby otrzymać parametry zapytania
Oficjalne źródło
źródło
Cześć, możesz użyć URLSearchParams, możesz przeczytać więcej na ten temat tutaj .
import:
i funkcja:
Uwaga : nie jest obsługiwany przez wszystkie platformy i wydaje się być w stanie „EKSPERYMENTALNYM” przez kątowe dokumenty
źródło
if (window.location.search.indexOf('?') == 0){ normalizedQueryString = window.location.search.substring(1); } else { normalizedQueryString = window.location.search; } let params = new URLSearchParams(normalizedQueryString);
Po pierwsze, znalazłem pracę z Angular2, że będzie to adres URL z ciągiem zapytania/path;query=value1
Aby uzyskać dostęp do tego komponentu, którego używasz Tak jest, ale teraz następuje blok kodu:
Co do tego, dlaczego zostałby usunięty podczas ładowania komponentu, nie jest to zachowanie domyślne. Sprawdziłem konkretnie w czystym projekcie testowym i nie zostałem przekierowany ani zmieniony. Czy jest to domyślna trasa, czy coś specjalnego w routingu?
Przeczytaj o routingu z ciągami zapytań i parametrami w samouczku Angular2 na https://angular.io/docs/ts/latest/guide/router.html#!#query-parameters
źródło
Parametry zapytania można uzyskać po przekazaniu w adresie URL za pomocą ActivatedRoute, jak podano poniżej: -
url: - http: /domain.com? test = abc
źródło
Uzyskaj parametr URL jako obiekt.
źródło
Jeśli chcesz uzyskać parametr zapytania tylko raz, najlepszym sposobem jest użycie metody take , dzięki czemu nie musisz się martwić o rezygnację z subskrypcji. Oto prosty fragment: -
Uwaga: Usuń take (1), jeśli chcesz użyć wartości parametrów w przyszłości.
źródło
teraz jest:
źródło
Mam nadzieję, że pomoże to komuś innemu.
Pytanie powyżej stwierdza, że wartość parametru zapytania jest potrzebna po przekierowaniu strony i możemy założyć, że wartość migawki (nieobserwowalna alternatywa) byłaby wystarczająca.
Nikt tutaj nie wspomniał o snapshot.paramMap.get z oficjalnej dokumentacji .
Więc przed wysłaniem dodaj to w komponencie wysyłającym / przekierowującym:
następnie przekieruj jako jedno z nich ( tutaj udokumentowane ):
lub po prostu:
Upewnij się, że dodałeś to do swojego modułu routingu, jak tu udokumentowano :
I wreszcie w komponencie, który musi użyć parametru zapytania
dodaj import (udokumentowany tutaj ):
wstrzyknąć ActivatedRoute
(dokumentacja importuje również SwitchMap, a także wstrzykuje Routera i HeroService - ale są one potrzebne tylko dla obserwowalnej alternatywy - NIE są one potrzebne, gdy używasz alternatywnej migawki, jak w naszym przypadku):
i uzyskaj potrzebną wartość (udokumentowaną tutaj ):
UWAGA: JEŚLI DODIESZ MODUŁ ROUTINGU DO MODUŁU FUNKCJI (JAK WYKAZANO W DOKUMENTACJI) UPEWNIJ SIĘ, ŻE W APP.MODULE.ts, ŻE MODUŁ ROUTINGU PRZYJMUJE PRZED modułem AppRoutingModule (lub innym plikiem z trasami aplikacji na poziomie administratora) W PRZYPADKU: []. INNE TRASY FUNKCJI NIE ZOSTANĄ ZNALEZIONE (TAK, JAKIE POWINNY BYĆ PO {path: '**', przekieruj do: '/ not-found'}, a zobaczysz tylko wiadomość nie znalezioną).
źródło
Musisz tylko wstrzyknąć ActivatedRoute do konstruktora, a następnie po prostu uzyskać dostęp do parametrów lub queryParams
W niektórych przypadkach nie daje to niczego w NgOnInit ... może z powodu wywołania init przed inicjalizacją parametrów w tym przypadku można to osiągnąć, prosząc obserwowalne, aby poczekało jakiś czas przez funkcję debounceTime (1000)
np. =>
debounceTime () Emituje wartość ze źródła obserwowalną dopiero po upływie określonego czasu bez emisji innej źródła
źródło
Nie możesz uzyskać parametru z RouterState, jeśli nie jest zdefiniowany w trasie, więc w twoim przykładzie musisz przeanalizować kwerendę ...
Oto kod, którego użyłem:
źródło
Zapytanie i ścieżka (Angular 8)
Jeśli masz adres URL taki jak https://myapp.com/owner/123/show?height=23, użyj
AKTUALIZACJA
W przypadku, gdy użyjesz,
this.router.navigate([yourUrl]);
a parametry zapytania są osadzone wyourUrl
ciągu, wówczas kątowy koduje adres URL i otrzymujesz coś takiego: https://myapp.com/owner/123/show%3Fheight%323 - i powyższe rozwiązanie da zły wynik ( queryParams będzie puste, a parametry zapytania można przykleić do ostatniego parametru ścieżki, jeśli znajduje się na końcu ścieżki). W takim przypadku zmień sposób nawigacji na toźródło