Wie kann ich mein $scope-Objekt von einem Controller zu einem anderen mit .$emit und .$on Methoden senden?
Sie können jedes beliebige Objekt innerhalb der Hierarchie Ihrer Anwendung senden, einschließlich $Umfang .
Hier eine kurze Vorstellung davon, wie Sendung y ausstrahlen. Arbeit.
Beachten Sie die folgenden Knoten, die alle innerhalb von Knoten 3 verschachtelt sind. Sie verwenden Sendung y ausstrahlen. wenn Sie dieses Szenario haben.
Anmerkung: Die Nummer eines jeden Knotens in diesem Beispiel ist willkürlich; es könnte leicht die Nummer eins, die Nummer zwei oder sogar die Nummer 1.348 sein. Jede Zahl ist nur ein Bezeichner für dieses Beispiel. Der Sinn dieses Beispiels ist es, die Verschachtelung von Angular-Controllern/Direktiven zu zeigen.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Sehen Sie sich diesen Baum an. Wie beantworten Sie die folgenden Fragen?
Anmerkung: Es gibt noch andere Möglichkeiten, diese Fragen zu beantworten, aber hier werden wir sie diskutieren Sendung y ausstrahlen. . Wenn Sie den folgenden Text lesen, gehen Sie davon aus, dass jede Nummer ihre eigene Datei hat (Richtlinie, Controller), z. B. one.js, two.js, three.js.
Wie funktioniert der Knoten 1 Knoten ansprechen 3 ?
In der Datei eins.js
scope.$emit('messageOne', someValue(s));
In der Datei drei.js - des obersten Knotens an alle für die Kommunikation erforderlichen untergeordneten Knoten.
scope.$on('messageOne', someValue(s));
Wie spricht Knoten 2 mit Knoten 3?
In der Datei zwei.js
scope.$emit('messageTwo', someValue(s));
In der Datei drei.js - des obersten Knotens an alle für die Kommunikation erforderlichen untergeordneten Knoten.
scope.$on('messageTwo', someValue(s));
Wie spricht Knoten 3 mit Knoten 1 und/oder Knoten 2?
In der Datei drei.js - des obersten Knotens an alle für die Kommunikation erforderlichen untergeordneten Knoten.
scope.$broadcast('messageThree', someValue(s));
In der Datei eins.js && zwei.js die Datei, in der Sie die Nachricht abfangen wollen, oder beide.
scope.$on('messageThree', someValue(s));
Wie spricht Knoten 2 mit Knoten 1?
In der Datei zwei.js
scope.$emit('messageTwo', someValue(s));
In der Datei drei.js - des obersten Knotens an alle für die Kommunikation erforderlichen untergeordneten Knoten.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
In der Datei eins.js
scope.$on('messageTwo', someValue(s));
WIE AUCH IMMER
Wenn Sie all diese verschachtelten Kindknoten haben, die auf diese Weise zu kommunizieren versuchen, werden Sie schnell viele $on's , $Ausstrahlung und $mitts .
Das mache ich gerne.
Im obersten PARENT NODE ( 3 in diesem Fall... ), der möglicherweise Ihr übergeordneter Controller ist...
Also, in der Datei drei.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
In jedem der untergeordneten Knoten müssen Sie jetzt nur noch $mit die Nachricht oder fangen sie mit an .
HINWEIS: Normalerweise ist es recht einfach, in einem verschachtelten Pfad über Kreuz zu sprechen, ohne $mit , $Ausstrahlung , oder an Das heißt, die meisten Anwendungsfälle sind, wenn Sie versuchen, den Knoten 1 zur Kommunikation mit dem Knoten 2 oder andersherum.
Wie spricht Knoten 2 mit Knoten 1?
In der Datei zwei.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
In der Datei drei.js - des obersten Knotens an alle für die Kommunikation erforderlichen untergeordneten Knoten.
Wir haben das bereits erledigt, erinnern Sie sich?
In der Datei eins.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Sie müssen noch Folgendes verwenden an mit jedem spezifischen Wert, den Sie abfangen wollen, aber jetzt können Sie in jedem der Knoten erstellen, was immer Sie wollen, ohne sich Gedanken darüber machen zu müssen, wie Sie die Nachricht über die Lücke des übergeordneten Knotens bekommen, da wir die generische pushChangesToAllNodes .