Es wurde versucht, einige grundlegende Informationen für AngularJS zu finden $rootScope.$broadcast
, aber die AngularJS-Dokumentation hilft nicht viel. In einfachen Worten, warum verwenden wir das?
Außerdem gibt es in John Papas Hot Towel- Vorlage eine benutzerdefinierte Funktion im allgemeinen Modul mit dem Namen $broadcast
:
function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}
Ich habe nicht verstanden, was das tut. Hier sind einige grundlegende Fragen:
1) Was macht $rootScope.$broadcast
?
2) Was ist der Unterschied zwischen $rootScope.$broadcast
und $rootScope.$broadcast.apply
?
$rootScope.$broadcast.apply()
wird verwendet, weil Sie (im Gegensatz zu ) verwenden müssen, wenn Sie das speziellearguments
Objekt an eine andere Funktion übergeben möchten . Zusätzlich zu @ Blackholes Link zur MDN-Seite zum Anwenden können Sie auch den Eintrag am überprüfen .apply()
call()
arguments
Antworten:
Was macht
$rootScope.$broadcast
das$rootScope.$broadcast
sendet ein Ereignis über den Anwendungsbereich. Jeder untergeordnete Bereich dieser App kann sie mit einem einfachen :$scope.$on()
.Es ist besonders nützlich, Ereignisse zu senden, wenn Sie einen Bereich erreichen möchten, der kein direktes übergeordnetes Element ist (z. B. ein Zweig eines übergeordneten Elements).
!!! Eine Sache, die Sie jedoch nicht tun sollten, ist die Verwendung
$rootScope.$on
von einem Controller aus.$rootScope
ist die Anwendung, wenn Ihr Controller zerstört wird, dass der Ereignis-Listener noch vorhanden ist, und wenn Ihr Controller erneut erstellt wird, werden nur mehr Ereignis-Listener angehäuft. (Eine Sendung wird also mehrmals abgefangen). Verwenden Sie$scope.$on()
stattdessen, und die Hörer werden ebenfalls zerstört.Was ist der Unterschied zwischen
$rootScope.$broadcast
&$rootScope.$broadcast.apply
?Manchmal müssen Sie verwenden
apply()
, insbesondere wenn Sie mit Direktiven und anderen JS-Bibliotheken arbeiten. Da ich diese Codebasis jedoch nicht kenne, kann ich nicht sagen, ob dies hier der Fall ist.quelle
$rootScope.$on
Speicherverlust. Dies gilt auch für die akzeptierte Antwort, da Controller wahrscheinlich die vonhiEventService
ihm erstellte Antwort aufrufen .$broadcast
gegen$broadcast.apply()
$rootScope
fungiert grundsätzlich als Ereignis-Listener und Dispatcher.Um die Frage zu beantworten, wie es verwendet wird, wird es in Verbindung mit verwendet
rootScope.$on
;Es ist jedoch eine schlechte Praxis, sie
$rootScope
als allgemeinen Ereignisdienst Ihrer eigenen App zu verwenden, da Sie schnell in eine Situation geraten, in der jede App von $ rootScope abhängt und Sie nicht wissen, welche Komponenten welche Ereignisse abhören.Am besten erstellen Sie einen Dienst für jedes benutzerdefinierte Ereignis, das Sie anhören oder senden möchten.
quelle
hiEventService.listen(callback)
von einem Controller aus anrufen , bleibt der Listener auch nach der Zerstörung des Controllers bestehen. Speicherleck! Die Bindung an den Controller-Bereich$scope.$on("hi",callback)
erfolgt mit einer automatischen Bereinigung.$ rootScope. $ Broadcast ist eine bequeme Möglichkeit, ein "globales" Ereignis auszulösen , auf das alle untergeordneten Bereiche warten können. Sie müssen nur
$rootScope
zum Senden der Nachricht verwenden, da alle untergeordneten Bereiche darauf warten können.Der Root-Bereich sendet das Ereignis:
Jeder untergeordnete Bereich kann auf das Ereignis hören:
Warum verwenden wir $ rootScope. $ Broadcast? Sie können
$watch
auf Variablenänderungen warten und Funktionen ausführen, wenn sich der Variablenstatus ändert. In einigen Fällen möchten Sie jedoch einfach ein Ereignis auslösen, auf das andere Teile der Anwendung warten können, unabhängig von einer Änderung des Status der Bereichsvariablen. Dies ist, wenn$broadcast
hilfreich ist.quelle
Daten weitergeben !!!
Ich frage mich, warum niemand erwähnt, dass
$broadcast
ein Parameter akzeptiert wird, bei dem Sie einen übergeben könnenObject
, der$on
mithilfe einer Rückruffunktion empfangen wirdBeispiel:
quelle
Was macht $ rootScope. $ Broadcast?
Es sendet die Nachricht an die jeweiligen Listener in der gesamten Winkel-App. Dies ist ein sehr leistungsfähiges Mittel, um Nachrichten an Bereiche auf verschiedenen Hierarchieebenen (Eltern, Kind oder Geschwister) zu übertragen.
In ähnlicher Weise haben wir $ rootScope. $ Emit. Der einzige Unterschied besteht darin, dass Ersteres auch von $ scope. $ On erfasst wird, während Letzteres nur von $ rootScope erfasst wird. $ On.
Beispiele finden Sie unter: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
quelle