Czy nie ma równoważne $scope.emit()
lub $scope.broadcast()
kątowej?
Znam EventEmitter
funkcjonalność, ale o ile rozumiem, po prostu wyśle zdarzenie do nadrzędnego elementu HTML.
Co jeśli będę musiał się komunikować między fx. rodzeństwo lub między komponentem w katalogu głównym DOM a elementem zagnieżdżonym na kilku poziomach głęboko?
Odpowiedzi:
Nie ma odpowiednika
$scope.emit()
ani$scope.broadcast()
z AngularJS. EventEmitter wewnątrz komponentu jest blisko, ale jak wspomniałeś, będzie emitował zdarzenie tylko do bezpośredniego komponentu nadrzędnego.W Angular istnieją inne alternatywy, które spróbuję wyjaśnić poniżej.
Powiązania @Input () pozwalają na podłączenie modelu aplikacji do grafu z ukierunkowanym obiektem (root do liści). Domyślnym zachowaniem strategii detektora zmian w komponencie jest propagowanie wszystkich zmian w modelu aplikacji dla wszystkich powiązań z dowolnego podłączonego komponentu.
Poza tym: Istnieją dwa typy modeli: Wyświetl modele i Modele aplikacji. Model aplikacji jest połączony za pomocą powiązań @Input (). Model widoku jest tylko właściwością komponentu (nie ozdobioną @Input ()), która jest związana w szablonie komponentu.
Aby odpowiedzieć na twoje pytania:
Co się stanie, jeśli będę musiał komunikować się między elementami rodzeństwa?
Model współdzielonej aplikacji : Rodzeństwo może komunikować się za pośrednictwem modelu współdzielonej aplikacji (podobnie jak kątowy 1). Na przykład, gdy jedno rodzeństwo wprowadza zmiany w modelu, drugie rodzeństwo, które ma powiązania z tym samym modelem, jest automatycznie aktualizowane.
Zdarzenia komponentu : komponenty potomne mogą emitować zdarzenie do komponentu nadrzędnego za pomocą powiązań @Output (). Komponent nadrzędny może obsługiwać zdarzenie i manipulować modelem aplikacji lub własnym modelem widoku. Zmiany w modelu aplikacji są automatycznie propagowane do wszystkich komponentów, które bezpośrednio lub pośrednio wiążą się z tym samym modelem.
Zdarzenia serwisowe : składniki mogą subskrybować zdarzenia serwisowe. Na przykład dwa komponenty rodzeństwa mogą zasubskrybować to samo zdarzenie serwisowe i odpowiedzieć, modyfikując odpowiednie modele. Więcej na ten temat poniżej.
Jak mogę komunikować się między komponentem głównym a komponentem zagnieżdżonym na kilku poziomach głębokości?
$scope.broadcast()
z Angulara 1. Kolejna sekcja opisuje ten pomysł bardziej szczegółowo.Przykład obserwowalnej usługi, która wykorzystuje zdarzenia serwisowe do propagowania zmian
Oto przykład obserwowalnej usługi, która wykorzystuje zdarzenia usługi do propagowania zmian. Po dodaniu TodoItem usługa emituje zdarzenie powiadamiające swoich subskrybentów.
Oto, w jaki sposób składnik główny zasubskrybuje to wydarzenie:
Komponent potomny zagnieżdżony na kilku poziomach w głębi zasubskrybowałby to wydarzenie w ten sam sposób:
Oto komponent, który wywołuje usługę w celu uruchomienia zdarzenia (może znajdować się w dowolnym miejscu w drzewie komponentów):
Odniesienie: Wykrywanie zmiany w kącie
źródło
itemAdded$
. Czy to konwencja RxJS czy coś takiego? Skąd to pochodzi?street
właściwość modelu aplikacji, ale ponieważ Angular 2 implementuje wykrywanie zmian przez tożsamość / referencję, żadne zmiany nie są propagowane (onChanges
nie są wywoływane), ponieważ referencja modelu aplikacji nie uległa zmianie ( cd ...)Poniższy kod jako przykład zamiany $ scope.emit () lub $ scope.broadcast () w Angular 2 przy użyciu usługi współdzielonej do obsługi zdarzeń.
Przykładowe użycie:
Nadawanie:
Słuchacz:
Może obsługiwać wiele argumentów:
źródło
off(name, listener) { this.listeners[name] = this.listeners[name].filter(x => x != listener); }
Korzystam z usługi wiadomości, która otacza rxjs
Subject
(TypeScript)Przykład plunkera: usługa wiadomości
Komponenty mogą subskrybować i transmitować wydarzenia (nadawca):
(odbiorca)
subscribe
MetodyMessageService
zwracającej rxjsSubscription
obiekt, który może być subskrypcję z tak:Zobacz także tę odpowiedź: https://stackoverflow.com/a/36782616/1861779
Przykład plunkera: usługa wiadomości
źródło
Property 'filter' does not exist on type 'Subject<EventMessage>'.
this.handler.pipe(filter(...))
. Zobacz operatorów do wynajęcia .return this.handler.pipe( filter(message => message.type === type), map(message => message.payload) ).subscribe(callback);
NIE używaj EventEmitter do komunikacji z usługą.
Powinieneś użyć jednego z obserwowalnych typów. Osobiście lubię BehaviorSubject.
Prosty przykład:
Możesz przejść do stanu początkowego, tutaj I null
Kiedy chcesz zaktualizować temat
Obserwuj z dowolnej usługi lub komponentu i działaj, gdy otrzyma nowe aktualizacje.
Oto więcej informacji. .
źródło
Za pomocą
EventEmitter lub obiektówobserwowalnych można utworzyć usługę eventbus zarejestrowaną w DI. Każdy komponent, który chce wziąć udział, po prostu żąda usługi jako parametru konstruktora i emituje i / lub subskrybuje zdarzenia.Zobacz też
źródło
Moim ulubionym sposobem jest użycie tematu lub emitera zdarzeń (prawie taki sam) w mojej usłudze do kontrolowania całego mojego podskładnika.
Używając kątowego cli, uruchom ng gs, aby utworzyć nową usługę, a następnie użyj BehaviorSubject lub EventEmitter
Gdy to zrobisz, każdy komponent korzystający z usługi jako dostawca będzie wiedział o zmianie. Po prostu zasubskrybuj wynik, tak jak robisz to z eventEmitter;)
źródło
Utworzyłem tutaj próbkę sub-publikacji:
http://www.syntaxsuccess.com/viewarticle/pub-sub-in-angular-2.0
Chodzi o to, aby użyć obiektów RxJs w celu podłączenia obserwatora i obserwatorów jako ogólnego rozwiązania do wysyłania i subskrybowania niestandardowych zdarzeń. W mojej próbce używam obiektu klienta do celów demonstracyjnych
Oto także demo na żywo: http://www.syntaxsuccess.com/angular-2-samples/#/demo/pub-sub
źródło
To jest moja wersja:
posługiwać się:
}
wydzielać:
źródło
Wdrożyliśmy obserwowalną dyrektywę ngModelChange, która wysyła wszystkie zmiany modelu przez emiter zdarzeń, który tworzysz we własnym komponencie. Musisz po prostu przypisać emiter zdarzeń do dyrektywy.
Zobacz: https://github.com/atomicbits/angular2-modelchangeobservable
W html powiąż emiter zdarzeń (countryChanged w tym przykładzie):
W komponencie maszynopis wykonaj pewne operacje asynchroniczne na EventEmitter:
źródło
Zdarzenia serwisowe: składniki mogą subskrybować zdarzenia serwisowe. Na przykład dwa komponenty rodzeństwa mogą zasubskrybować to samo zdarzenie serwisowe i odpowiedzieć, modyfikując odpowiednie modele. Więcej na ten temat poniżej.
Pamiętaj jednak, aby zrezygnować z subskrypcji po zniszczeniu komponentu nadrzędnego.
źródło