Wie kann ich mein $ scope-Objekt mit den Methoden. $ Emit und. $ On von einem Controller an einen anderen senden?
Sie können jedes gewünschte Objekt innerhalb der Hierarchie Ihrer App senden, einschließlich $ scope .
Hier ist eine kurze Vorstellung davon, wie Broadcast und Emit funktionieren.
Beachten Sie die Knoten unten; Alle in Knoten 3 verschachtelt. In diesem Szenario verwenden Sie Broadcast und Emit .
Hinweis: Die Nummer jedes Knotens in diesem Beispiel ist beliebig. es könnte leicht die Nummer eins sein; die Nummer zwei; oder sogar die Nummer 1.348. Jede Nummer ist nur eine Kennung für dieses Beispiel. In diesem Beispiel soll die Verschachtelung von Angular-Controllern / Direktiven gezeigt werden.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Schauen Sie sich diesen Baum an. Wie beantworten Sie die folgenden Fragen?
Hinweis: Es gibt andere Möglichkeiten, diese Fragen zu beantworten. Hier werden jedoch die Übertragung und die Übertragung erläutert . Wenn Sie den folgenden Text lesen, nehmen Sie an, dass jede Nummer eine eigene Datei (Direktive, Controller) hat, z. B. one.js, two.js, three.js.
Wie spricht Knoten 1 mit Knoten 3 ?
In der Datei one.js
scope.$emit('messageOne', someValue(s));
In Datei three.js - der oberste Knoten zu allen untergeordneten Knoten, die für die Kommunikation benötigt werden.
scope.$on('messageOne', someValue(s));
Wie spricht Knoten 2 mit Knoten 3?
In der Datei two.js
scope.$emit('messageTwo', someValue(s));
In Datei three.js - der oberste Knoten zu allen untergeordneten Knoten, die für die Kommunikation benötigt werden.
scope.$on('messageTwo', someValue(s));
Wie spricht Knoten 3 mit Knoten 1 und / oder Knoten 2?
In Datei three.js - der oberste Knoten zu allen untergeordneten Knoten, die für die Kommunikation benötigt werden.
scope.$broadcast('messageThree', someValue(s));
In der Datei one.js && two.js die Datei, in der Sie die Nachricht abfangen möchten, oder beides.
scope.$on('messageThree', someValue(s));
Wie spricht Knoten 2 mit Knoten 1?
In der Datei two.js
scope.$emit('messageTwo', someValue(s));
In Datei three.js - der oberste Knoten zu allen untergeordneten Knoten, die für die Kommunikation benötigt werden.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
In der Datei one.js
scope.$on('messageTwo', someValue(s));
JEDOCH
Wenn alle diese verschachtelten untergeordneten Knoten versuchen, auf diese Weise zu kommunizieren, werden Sie schnell viele $ ons , $ Broadcasts und $ emits sehen .
Folgendes mache ich gerne.
Im obersten ELTERNKNOTEN ( in diesem Fall 3 ...), der möglicherweise Ihr übergeordneter Controller ist ...
Also, in Datei drei.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Jetzt müssen Sie in einem der untergeordneten Knoten nur noch $ die Nachricht ausgeben oder sie mit $ on abfangen .
HINWEIS: Normalerweise ist es recht einfach, in einem verschachtelten Pfad zu sprechen, ohne $ emit , $ Broadcast oder $ on zu verwenden . Dies bedeutet, dass die meisten Anwendungsfälle auftreten, wenn Sie versuchen, Knoten 1 zur Kommunikation mit Knoten 2 zu bewegen oder umgekehrt.
Wie spricht Knoten 2 mit Knoten 1?
In der Datei two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
In Datei three.js - der oberste Knoten zu allen untergeordneten Knoten, die für die Kommunikation benötigt werden.
Wir haben das schon erledigt, erinnerst du dich?
In der Datei one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Sie müssen weiterhin $ on für jeden bestimmten Wert verwenden, den Sie abfangen möchten. Jetzt können Sie jedoch in jedem der Knoten beliebige Werte erstellen, ohne sich Gedanken darüber machen zu müssen, wie die Nachricht beim Abfangen und Senden über die Lücke des übergeordneten Knotens übertragen werden kann die generischen pushChangesToAllNodes .
Hoffe das hilft...
$rootScope
für Broadcast / Emit verwenden, wenn dies vermieden werden kann.