Gibt es einen Grund, dies vorzuziehen , nachdem der Leistungsunterschied zwischen $broadcast
und $emit
beseitigt wurde ?$scope.$emit
$rootScope.$broadcast
Sie sind anders, ja.
$emit
ist auf die Bereichshierarchie (nach oben) beschränkt - dies mag gut sein, wenn es zu Ihrem Design passt, aber es scheint mir eine eher willkürliche Einschränkung zu sein.
$rootScope.$broadcast
funktioniert über alle, die sich dafür entscheiden , das Ereignis anzuhören, was für mich eine vernünftigere Einschränkung darstellt.
Vermisse ich etwas
BEARBEITEN:
Um als Antwort auf eine Antwort zu verdeutlichen, ist die Richtung des Versands nicht das Problem, nach dem ich suche. $scope.$emit
sendet das Ereignis nach oben und $scope.$broadcast
- nach unten. Aber warum nicht immer verwenden $rootScope.$broadcast
, um alle beabsichtigten Zuhörer zu erreichen?
quelle
Antworten:
tl; dr (dieses tl; dr stammt aus der Antwort von @ sp00m unten)
Ausführliche Erklärung
$rootScope.$emit
lässt nur andere$rootScope
Hörer es fangen. Das ist gut, wenn Sie nicht wollen, dass jeder$scope
es bekommt. Meistens eine Kommunikation auf hohem Niveau. Stellen Sie sich das als Erwachsene vor, die in einem Raum miteinander sprechen, damit die Kinder sie nicht hören können.$rootScope.$broadcast
ist eine Methode, mit der so ziemlich alles es hören kann. Dies wäre das Äquivalent zu Eltern, die schreien, dass das Abendessen fertig ist, damit jeder im Haus es hört.$scope.$emit
ist, wenn Sie das$scope
und alle seine Eltern wollen und$rootScope
das Ereignis zu hören. Dies ist ein Kind, das zu Hause zu seinen Eltern jammert (aber nicht in einem Lebensmittelgeschäft, in dem andere Kinder hören können).$scope.$broadcast
ist für$scope
sich und seine Kinder. Dies ist ein Kind, das seinen Stofftieren zuflüstert, damit ihre Eltern nichts hören können.quelle
$rootScope
Sendungen nach Möglichkeit vermeiden , können Sie sie besser wiederverwenden.Sie erledigen nicht den gleichen Job: Sie
$emit
senden ein Ereignis über die Bereichshierarchie nach oben , während$broadcast
sie ein Ereignis nach unten an alle untergeordneten Bereiche senden.quelle
$rootScope
?Ich habe die folgende Grafik aus dem folgenden Link gemacht: https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Wie Sie sehen können,
$rootScope.$broadcast
trifft viel mehr Zuhörer als$scope.$emit
.Außerdem
$scope.$emit
kann der Blaseneffekt aufgehoben werden, während$rootScope.$broadcast
dies nicht möglich ist.quelle
$ scope. $ emit: Diese Methode löst das Ereignis nach oben aus (vom Kind zum Elternteil).
$ scope. $ Broadcast: Die Methode sendet das Ereignis in Abwärtsrichtung (von übergeordnet zu untergeordnet) an alle untergeordneten Controller.
$ scope. $ on: Die Methode registriert sich, um ein Ereignis abzuhören. Alle Controller, die dieses Ereignis abhören, erhalten eine Benachrichtigung über die Übertragung oder Ausgabe, basierend darauf, wo diese in die Hierarchie zwischen Kind und Eltern passen.
Das $ emit-Ereignis kann von jedem $ -Bereich abgebrochen werden, der das Ereignis abhört.
Das $ on stellt die Methode "stopPropagation" bereit. Durch Aufrufen dieser Methode kann verhindert werden, dass sich das Ereignis weiter ausbreitet.
Plunker: https://embed.plnkr.co/0Pdrrtj3GEnMp2UpILp4/
Bei Geschwisterbereichen (den Bereichen, die nicht in der direkten Eltern-Kind-Hierarchie enthalten sind) kommunizieren $ emit und $ Broadcast nicht mit den Geschwisterbereichen.
Weitere Informationen finden Sie unter http://yogeshtutorials.blogspot.in/2015/12/event-based-communication-between-angularjs-controllers.html
quelle
@Eddie hat die gestellte Frage perfekt beantwortet. Ich möchte jedoch darauf aufmerksam machen, dass Pub / Sub effizienter eingesetzt wird.
Wie diese Antwort nahelegt,
Sie können ein
angular-PubSub
Winkelmodul verwenden. Sobald SiePubSub
Ihrer App-Abhängigkeit ein Modul hinzugefügt haben , können Sie mithilfe desPubSub
Dienstes Ereignisse / Themen abonnieren und abbestellen.Einfach zu abonnieren:
Einfach zu veröffentlichen
Verwenden Sie zum Abbestellen
PubSub.unsubscribe(sub);
ORPubSub.unsubscribe('event-name');
.HINWEIS Vergessen Sie nicht, sich abzumelden, um Speicherlecks zu vermeiden.
quelle
Verwenden Sie RxJS in einem Dienst
Erstellen Sie einen Dienst mit RxJS-Erweiterungen für Angular .
Dann abonnieren Sie einfach die Änderungen.
Kunden können Änderungen mit abonnieren
DataService.subscribe
und Produzenten können Änderungen mit vorantreibenDataService.set
.Die DEMO auf PLNKR .
quelle