2014-09-05 8 views
9

Ich verstehe, dass $ emit sendet Nachrichten in den DOM-Baum, und $ Broadcast sendet Nachrichten nach unten.AngularJS-Ereignisausbreitung - Geschwister?

Was ist mit dem Senden von Nachrichten zwischen Geschwister DOM-Elementen — Wie mache ich das?

Antwort

12

Es sendet es nicht den DOM-Baum. Es sendet es in den Bereichsbaum, also gibt es kein Konzept für gleichgeordnete DOM-Elemente im Umgang mit Bereichen. Was Sie mit $ emit tun können, ist $ emittieren Sie es bis zum Eltern, stoppen Sie die Verbreitung und dann Broadcast, die alle Geschwister abholen werden (sowie ihre Kinder)

9

Es gibt keinen Mechanismus zum Senden an Bereiche mit der gleiches Elternteil. Im Allgemeinen würden Sie vom root-Bereich aus senden, da Ihre Nachrichten eindeutig sein sollten und die meisten Bereiche sie einfach ignorieren würden. Sie können Broadcasts von einem übergeordneten Element aus senden, das Bereiche weiter oben im Baum und deren Nachkommen ignorieren sollte. Es wird jedoch immer auf alle Nachkommen des übergeordneten Elements und nicht nur auf die Geschwister des Bereichs, den Sie betrachten, weitergeleitet. Sie könnten immer die Meldung ignorieren, wenn deine Eltern nicht der Umfang ist wurde es übertragen auf:

$scope.$parent.$broadcast('MyUniqueEventName', data); 

$scope.$on('MyUniqueEventName', function(event, data) { 
    if ($scope.$parent !== event.targetScope) { 
     return; 
    } 
    // do something with data 
}); 
+1

Sie müssen nur mit dieser vorsichtig sein Ansatz, weil es Ihren Code eng koppelt, müssen Sie immer manuell sicherstellen, dass $ scope. $ parent ist die richtige übergeordnete, die Ihren Code weniger haltbar macht. –

+0

Sehr wahr. Zum Beispiel, wenn Sie dies in einem Repeater, einem Schalter oder einem, wenn es einen Kind-Bereich erstellen und der Bereich, aus dem Sie senden möchten, könnte leicht der Großeltern sein. –

0

In meinem Fall habe ich ganz zufrieden bin mit:

$rootScope.$broadcast('my event');