W jednym z moich szablonów tras Angular 2 ( FirstComponent ) mam przycisk
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
Moim celem jest osiągnięcie:
Kliknij przycisk -> wybierz trasę do innego komponentu, zachowując dane i bez używania tego komponentu jako dyrektywy.
Właśnie tego próbowałem ...
1. PODEJŚCIE
W tym samym widoku przechowuję gromadzenie tych samych danych na podstawie interakcji użytkownika.
first.component.ts
export class FirstComponent {
constructor(private _router: Router) { }
property1: number;
property2: string;
property3: TypeXY; // this a class, not a primitive type
// here some class methods set the properties above
// DOM events
routeWithData(){
// here route
}
}
Normalnie kierowałbym się do SecondComponent przez
this._router.navigate(['SecondComponent']);
ostatecznie przekazując dane
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
natomiast definicja powiązania z parametrami byłaby
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
Problem z tym podejściem polega na tym, że nie mogę przekazać złożonych danych (np. Obiektu takiego jak property3) do adresu URL;
2. PODEJŚCIE
Alternatywą byłoby włączenie SecondComponent jako dyrektywy w FirstComponent.
<SecondComponent [p3]="property3"></SecondComponent>
Jednak chcę trasie do tego składnika, nie obejmują go!
3. PODEJŚCIE
Najbardziej realnym rozwiązaniem, jakie tu widzę, byłoby skorzystanie z usługi (np. FirstComponentService)
- przechowuj dane (_firstComponentService.storeData ()) na routeWithData () w FirstComponent
- odzyskać dane (_firstComponentService.retrieveData ()) w ngOnInit () w SecondComponent
Chociaż takie podejście wydaje się całkowicie wykonalne, zastanawiam się, czy jest to najłatwiejszy / najbardziej elegancki sposób na osiągnięcie celu.
Ogólnie chciałbym wiedzieć, czy brakuje mi innych potencjalnych podejść do przekazywania danych między komponentami, szczególnie przy mniejszej możliwej ilości kodu
źródło
Pass data using Query Parameters
tego szukałem. twój link uratował mi dzień.state
Sprawdź PR, aby uzyskać więcej szczegółów. Kilka przydatnych informacji tutajOdpowiedzi:
aktualizacja 4.0.0
Zobacz dokumentację Angular, aby uzyskać więcej informacji https://angular.io/guide/router#fetch-data-before-navigating
oryginalny
Korzystanie z usługi jest właściwą drogą. W parametrach trasy należy przekazywać tylko te dane, które mają być odzwierciedlone w pasku adresu URL przeglądarki.
Zobacz także https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
Router dostarczany z RC.4 ponownie się wprowadza
data
Zobacz także Plunker na https://github.com/angular/angular/issues/9757#issuecomment-229847781
źródło
ngOnInit() { this.myVar = this.route.snapshot.data['some_data']; }
NavigationExtras
- stackoverflow.com/a/54879389/1148107Myślę, że skoro nie mamy $ rootScope w Angular 2, jak w Angular 1.x. Podczas korzystania z ngOnDestroy możemy korzystać z wspólnej usługi / klasy angular 2 i przekazywać dane do usługi, a po routingu pobrać dane z usługi w funkcji ngOnInit :
Tutaj używam DataService do udostępniania obiektu bohatera:
Przekaż obiekt z pierwszej strony:
Pobierz obiekt z komponentu drugiej strony:
Oto przykład: plunker
źródło
this.hero = this.dataService.hero
? Czy dostanę wartości?Cóż, najłatwiejszym sposobem, aby to zrobić w Angular 6 lub innych wersjach Mam nadzieję, że po prostu zdefiniujesz swoją ścieżkę za pomocą ilości danych, które chcesz przekazać
jak widać z mojej definicji tras, dodałem
/:id
opcję „stand” do danych, które chcę przekazać do komponentu za pośrednictwem nawigacji routera. Dlatego twój kod będzie wyglądałaby odczytać
id
składnik, wystarczy zaimportowaćActivatedRoute
jaki na miejscu, w
ngOnInit
którym odzyskujesz danemożesz przeczytać więcej w tym artykule https://www.tektutorialshub.com/angular-passing-parameters-to-route/
źródło
W Angular 7.2.0 wprowadzono nowy sposób przekazywania danych podczas nawigacji między trasowanymi komponentami:
Lub:
Aby odczytać stan, możesz uzyskać dostęp do
window.history.state
właściwości po zakończeniu nawigacji:źródło
window.history.state
zwraca coś podobnego{navigationId: 2}
zamiast zwracanego obiektu, który przekazałem.navigationId
z wartością dodaną. Jeśli nie zostaną dodane żadne dane,navigationId
zostaną wyświetlone tylko te. Zobacz przekazane dane, wróć lub odśwież aplikację i ponownie uruchom działanie, które dodaje dane do trasy i nawiguje do następnej trasy (np. Kliknięcie przycisku). Spowoduje to dodanie twoich danych do obiektu.Jakaś super inteligentna osoba (tmburnell), która nie jest mną, sugeruje ponowne zapisanie danych trasy:
Jak widać tutaj w komentarzach.
Mam nadzieję, że ktoś uzna to za przydatne
źródło
Ja to drugie podejście nie jest dobre dla tego problemu. Wydaje mi się, że najlepszym podejściem jest parametr zapytania według
Router
kąta, który ma 2 sposoby:Z tym kodem można poruszać się
url
przezparams
w kodzie html:Musisz wstrzyknąć router w
constructor
taki sposób, jak:Teraz użyj takich jak:
Teraz, jeśli chcesz czytać
Router
w innymComponent
, musisz użyćActivatedRoute
:i
subscribe
że:źródło
Jest rok 2019 i wiele odpowiedzi tutaj zadziała, w zależności od tego, co chcesz zrobić. Jeśli chcesz przekazać w stanie wewnętrznym niewidocznym w adresie URL (parametry, zapytanie), możesz używać
state
od wersji 7.2 (jak się dowiedziałem dzisiaj :)).Z bloga (napisy Tomasz Kula) - nawigujesz do trasy ....
... z ts:
this.router.navigateByUrl('/details', { state: { hello: 'world' } });
... z szablonu HTML:
<a routerLink="/details" [state]="{ hello: 'world' }">Go</a>
I aby podnieść go w komponencie docelowym:
Późno, ale mam nadzieję, że to pomoże komuś z ostatnim Angular.
źródło
Rozwiązanie z ActiveRoute (jeśli chcesz przekazać obiekt po trasie - użyj JSON.stringfy / JSON.parse):
Przygotuj obiekt przed wysłaniem:
Odbierz swój obiekt w komponencie docelowym:
źródło
super.ngOnInit();
?Trzecie podejście jest najczęstszym sposobem udostępniania danych między komponentami. możesz wstrzyknąć usługę produktu, której chcesz użyć w powiązanym komponencie.
źródło
Przekaż za pomocą JSON
źródło
użyj wspólnej usługi do przechowywania danych z niestandardowym indeksem. następnie wyślij ten niestandardowy indeks za pomocą queryParam. takie podejście jest bardziej elastyczne .
.
źródło
powiedz, że masz
i chcesz przekazać dane do component2.ts .
w component1.ts jest zmienną z danymi powiedzmy
źródło
Możesz użyć BehaviorSubject do udostępniania danych między routowanymi komponentami. Obiekt BehaviourSubject zawiera jedną wartość. Po zasubskrybowaniu natychmiast emituje wartość. Podmiot nie ma wartości.
W serwisie.
W komponencie możesz zasubskrybować ten BehaviorSubject.
Uwaga: Temat nie będzie tu działał, należy użyć wyłącznie Przedmiotu zachowania.
źródło