Mam dwa składniki w następujący sposób i chcę wywołać funkcję z innego składnika. Oba komponenty są zawarte w trzecim nadrzędnym komponencie using.
Składnik 1:
@component(
selector:'com1'
)
export class com1{
function1(){...}
}
Składnik 2:
@component(
selector:'com2'
)
export class com2{
function2(){...
// i want to call function 1 from com1 here
}
}
Próbowałem użyć @input
i @output
ale nie rozumiem dokładnie, jak go używać i jak wywołać tę funkcję, czy ktoś może pomóc?
angular
angular2-components
noobProgrammer
źródło
źródło
Odpowiedzi:
Jeśli com1 i com2 są rodzeństwem, możesz użyć
com2 emituje zdarzenie przy użyciu pliku
EventEmitter
Tutaj komponent nadrzędny dodaje powiązanie zdarzenia w celu nasłuchiwania
myEvent
zdarzeń, a następnie wywołuje,com1.function1()
gdy takie zdarzenie ma miejsce.#com1
to zmienna szablonu, która pozwala odwołać się do tego elementu z innego miejsca w szablonie. Używamy tego dokonaćfunction1()
obsługi zdarzeń dlamyEvent
odcom2
:Aby zapoznać się z innymi opcjami komunikacji między komponentami, zobacz także interakcje komponentów
źródło
<sibling1 (myEvent)="...">
jest powiązaniem zdarzenia dla rodzica / hosta, ponieważ jest to jedyny sposób, w jaki zapewnia Angular. Jednak program obsługi zdarzeń wywołuje metodę na drugiej siostrzanej (com1
). Rodzic pełni rolę mediatora.somecomponent.ts
?Po pierwsze, czego potrzebujesz, aby zrozumieć relacje między komponentami. Następnie możesz wybrać odpowiednią metodę komunikacji. Postaram się wyjaśnić wszystkie metody, które znam i wykorzystuję w swojej praktyce do komunikacji między komponentami.
Jakie mogą istnieć relacje między komponentami?
1. Rodzic> Dziecko
Udostępnianie danych poprzez wejście
Jest to prawdopodobnie najpopularniejsza metoda udostępniania danych. Działa przy użyciu
@Input()
dekoratora, aby umożliwić przekazywanie danych przez szablon.parent.component.ts
child.component.ts
To bardzo prosta metoda. Jest łatwy w użyciu. Możemy również wychwycić zmiany w danych w komponencie podrzędnym za pomocą ngOnChanges .
Ale nie zapominajmy, że jeśli użyjemy obiektu jako danych i zmienimy parametry tego obiektu, odniesienie do niego się nie zmieni. Dlatego jeśli chcemy otrzymać zmodyfikowany obiekt w komponencie potomnym, musi on być niezmienny.
2. Dziecko> Rodzic
Udostępnianie danych przez ViewChild
ViewChild umożliwia jednego komponentu do innego, dając rodzicowi dostęp do jego atrybutów i funkcji. Jest jednak jedno zastrzeżenie
child
nie będą one dostępne do czasu zainicjowania widoku. Oznacza to, że musimy zaimplementować hak cyklu życia AfterViewInit, aby otrzymać dane od dziecka.parent.component.ts
child.component.ts
Udostępnianie danych przez Output () i EventEmitter
Innym sposobem udostępniania danych jest emitowanie danych od dziecka, które może wyświetlić rodzic. Takie podejście jest idealne, gdy chcesz udostępniać zmiany danych, które mają miejsce w przypadku kliknięć przycisków, wpisów formularzy i innych zdarzeń użytkownika.
parent.component.ts
child.component.ts
3. Rodzeństwo
Dziecko> Rodzic> Dziecko
Poniżej staram się wyjaśnić inne sposoby komunikacji między rodzeństwem. Ale mogłeś już zrozumieć jeden ze sposobów zrozumienia powyższych metod.
parent.component.ts
child-one.component.ts
child-two.component.ts
4. Niepowiązane komponenty
Wszystkie metody, które opisałem poniżej, można zastosować do wszystkich powyższych opcji relacji między komponentami. Ale każdy ma swoje zalety i wady.
Udostępnianie danych usłudze
Podczas przekazywania danych między komponentami pozbawionymi bezpośredniego połączenia, takimi jak rodzeństwo, wnuki itp., Należy korzystać z usługi współdzielonej. Kiedy masz dane, które powinny być zawsze zsynchronizowane, uważam, że RxJS BehaviorSubject jest bardzo przydatne w tej sytuacji.
data.service.ts
first.component.ts
second.component.ts
Udostępnianie danych trasom
Czasami trzeba nie tylko przekazywać proste dane między komponentami, ale także zapisać stan strony. Na przykład chcemy zapisać jakiś filtr na rynku online, a następnie skopiować ten link i wysłać znajomemu. Oczekujemy, że otworzy stronę w tym samym stanie co my. Pierwszym i prawdopodobnie najszybszym sposobem na zrobienie tego byłoby użycie parametrów zapytania .
Parametry zapytania wyglądają bardziej zgodnie z linią
/people?id=
gdzieid
mogą być równe wszystkim i możesz mieć tyle parametrów, ile chcesz. Parametry zapytania byłyby oddzielone znakiem ampersand.Podczas pracy z parametrami zapytania nie musisz definiować ich w pliku tras i można je nazwać parametrami. Na przykład weź następujący kod:
page1.component.ts
Na stronie odbiorczej otrzymasz następujące parametry zapytania, takie jak:
page2.component.ts
NgRx
Ostatnim sposobem, który jest bardziej skomplikowany, ale potężniejszy, jest użycie NgRx . Ta biblioteka nie służy do udostępniania danych; jest to potężna biblioteka zarządzania stanem. Nie potrafię w krótkim przykładzie wyjaśnić, jak go używać, ale możesz wejść na oficjalną stronę i przeczytać dokumentację na jej temat.
Dla mnie NgRx Store rozwiązuje wiele problemów. Na przykład, gdy masz do czynienia z obserwowalnymi i gdy odpowiedzialność za pewne obserwowalne dane jest dzielona między różnymi komponentami, akcje przechowywania i reduktor zapewniają, że modyfikacje danych zawsze będą przeprowadzane „we właściwy sposób”.
Zapewnia również niezawodne rozwiązanie do buforowania żądań HTTP. Będziesz mógł przechowywać żądania i ich odpowiedzi, abyś mógł sprawdzić, czy żądanie, które składasz, nie ma jeszcze zapisanej odpowiedzi.
Możesz przeczytać o NgRx i zrozumieć, czy potrzebujesz go w swojej aplikacji, czy nie:
Na koniec chcę powiedzieć, że przed wybraniem niektórych metod udostępniania danych należy zrozumieć, w jaki sposób dane te będą wykorzystywane w przyszłości. Chodzi mi o to, że może teraz możesz użyć tylko
@Input
dekoratora do udostępnienia nazwy użytkownika i nazwiska. Następnie dodasz nowy komponent lub nowy moduł (na przykład panel administracyjny), który potrzebuje więcej informacji o użytkowniku. Oznacza to, że może to być lepszy sposób korzystania z usługi dla danych użytkownika lub inny sposób udostępniania danych. Musisz się nad tym bardziej zastanowić, zanim zaczniesz wdrażać udostępnianie danych.źródło
Dostęp do metody składnika jeden można uzyskać z drugiego składnika.
componentOne
componentTwo
ComponentTwo plik html
źródło
Komponent 1 (dziecko):
Komponent 2 (rodzic):
źródło
@ViewChild
który działał dla mnie. Dzięki za ten przykład.Zależy to od relacji między komponentami (rodzic / dziecko), ale najlepszym / ogólnym sposobem tworzenia komponentów komunikacyjnych jest użycie usługi współdzielonej.
Więcej informacji znajdziesz w tym dokumencie:
Mając to na uwadze, możesz użyć następujących elementów, aby zapewnić wystąpienie com1 w com2:
W com2 możesz użyć:
źródło
@Input
na boisku?<button (click)="dbgraph.displayTableGraph()">Graph</button> <dbstats-graph #dbgraph></dbstats-graph>
Zwróć uwagę na lokalną zmienną
#dbgraph
w komponencie potomnym, której rodzic może użyć, aby uzyskać dostęp do jego metod (dbgraph.displayTableGraph()
).źródło
Korzystając z Dataservice możemy wywołać funkcję z innego komponentu
Component1: Komponent, który nazywamy funkcją
dataservice.ts
Komponent2: komponent zawierający funkcję
źródło
if ( this.bookmarkRoot.callToggle.observers.length === 0 ) { this.bookmarkRoot.callToggle.subscribe(( data ) => { this.closeDrawer(); } ) }