Czytałem pytania takie jak Access EventEmitter Service w CustomHttp, w których użytkownik korzysta ze EventEmitter w swojej usłudze, ale w tym komentarzu zasugerowano mu, aby nie korzystał z niego i zamiast tego używał Observable bezpośrednio w swoich usługach.
Przeczytałem również to pytanie, w którym rozwiązanie sugeruje przekazanie EventEmitter dziecku i zasubskrybowanie go.
Moje pytanie brzmi zatem: czy powinienem, czy też nie powinienem subskrybować ręcznie EventEmitter? Jak mam go używać?
angular
angular2-services
Eric Martinez
źródło
źródło
Odpowiedzi:
TL; DR :
Nie, nie subskrybuj ich ręcznie, nie używaj ich w usługach. Używaj ich, jak pokazano w dokumentacji, tylko do emitowania zdarzeń w komponentach. Nie pokonuj abstrakcji kątowej.
Odpowiedź:
Nie, nie powinieneś subskrybować go ręcznie.
EventEmitter to abstrakcja kątowa2, której jedynym celem jest emitowanie zdarzeń w komponentach. Cytując komentarz Roba Wormalda
Stwierdzono to bardzo wyraźnie w dokumentacji EventEmitter.
Co jest złego w korzystaniu z niego?
Angular2 nigdy nie zagwarantuje nam, że EventEmitter będzie nadal obserwowalny. Oznacza to przefaktoryzowanie naszego kodu, jeśli się zmieni. Jedynym API, do którego musimy uzyskać dostęp, jest jego
emit()
metoda. Nigdy nie powinniśmy subskrybować ręcznie EventEmitter.Wszystkie powyższe stwierdzenia są bardziej jasne w komentarzu Warda Bella (zalecane, aby przeczytać artykuł i odpowiedź na ten komentarz). Cytowanie w celach informacyjnych
Jego komentarz jest zgodny z komentarzem Roba dawno temu.
Jak więc właściwie go używać?
Po prostu użyj go, aby emitować zdarzenia ze swojego komponentu. Spójrz na następujący przykład.
Jak tego nie używać?
Zatrzymaj się tutaj ... już się mylisz ...
Mamy nadzieję, że te dwa proste przykłady wyjaśnią prawidłowe użycie EventEmitter.
źródło
directives : [Child]
w definicji komponentu? Wydaje się, że to się nie kompiluje i nie mogę go znaleźć w dokumentacji Angular2.directives
od tego czasu słowo kluczowe jest przestarzałe. Użyjdeclarations
słowa kluczowego w,@NgModule
jak tutaj lub tutajTak, śmiało i używaj go.
EventEmitter
jest publicznym, udokumentowanym typem końcowego API Angular Core. NieObservable
ma znaczenia, czy jest on oparty, czy nie ; jeśli jest to udokumentowaneemit
isubscribe
metody odpowiadają temu, czego potrzebujesz, skorzystaj z niego.Jak stwierdzono również w dokumentach:
Chcieli więc
Observable
podobnego obiektu, który zachowuje się w określony sposób, zaimplementowali go i upublicznili. Gdyby nie była to tylko wewnętrzna abstrakcja kątowa, której nie należy używać, nie upubliczniliby jej.Wiele razy warto mieć emiter, który wysyła zdarzenia określonego typu. Jeśli to twój przypadek użycia, idź do niego. Jeśli / kiedy dostępna jest referencyjna implementacja specyfikacji, do której odsyłają, powinna ona zastępować drop-in, tak jak w przypadku każdego innego wypełniacza.
Tylko upewnij się, że generator przekazywany do
subscribe()
funkcji jest zgodny z połączoną specyfikacją. Zwrócony obiekt ma zagwarantowanąunsubscribe
metodę, którą należy wywołać, aby zwolnić wszelkie odniesienia do generatora (jest to obecnie obiekt RxJs,Subscription
ale tak naprawdę jest to szczegół implementacji, na którym nie należy polegać).Wszystkie mocno sformułowane przewidywania dotyczące zagłady i mroku wydają się wynikać z jednego komentarza przepełnienia stosu od jednego dewelopera w przedpremierowej wersji Angular 2.
źródło
Jeśli chcesz mieć interakcję między komponentami, musisz wiedzieć, czym są @Input, @Output, EventEmitter i Tematy.
Jeśli relacja między komponentami jest nadrzędna-podrzędna lub odwrotnie, używamy @input i @output z emiterem zdarzeń.
@output emituje zdarzenie i musisz je emitować za pomocą emitera zdarzeń.
Jeśli nie jest to związek rodzicielski z dzieckiem ... musisz użyć przedmiotów lub za pośrednictwem wspólnej usługi.
źródło
Nie ma: nie i nie: tak. Prawda jest w środku I nie ma powodów, aby się bać z powodu kolejnej wersji Angulara.
Z logicznego punktu widzenia, jeśli masz komponent i chcesz poinformować inne komponenty, że coś się dzieje, zdarzenie powinno zostać uruchomione i można to zrobić w dowolny sposób, który według ciebie (programisty) należy zrobić. Nie widzę powodu, aby go nie używać i nie widzę powodu, dla którego warto go używać za wszelką cenę. Również nazwa EventEmitter sugeruje mi wydarzenie. Zwykle używam go do ważnych wydarzeń mających miejsce w Komponencie. Tworzę usługę, ale tworzę plik usługi w folderze składników. Tak więc mój plik usługi staje się rodzajem Menedżera zdarzeń lub Interfejsu zdarzeń, dzięki czemu mogę szybko zorientować się, które zdarzenie mogę subskrybować w bieżącym składniku.
Wiem ... Może jestem trochę staroświeckim programistą. Ale to nie jest część wzorca projektowania opartego na zdarzeniach, jest to część decyzji dotyczących architektury oprogramowania dla konkretnego projektu.
Niektórzy inni faceci mogą myśleć, że bezpośrednie użycie Observables jest fajne. W takim przypadku przejdź bezpośrednio do Observables. Robiąc to, nie jesteś seryjnym zabójcą. Jeśli nie jesteś programistą psychopatów, do tej pory Program działa, zrób to.
źródło