Ich habe einen footerController und einen codeScannerController mit unterschiedlichen Ansichten.
angular.module('myApp').controller('footerController', ["$scope", function($scope) {}]);
angular.module('myApp').controller('codeScannerController', ["$scope", function($scope) {
console.log("start");
$scope.startScanner = function(){...
Wenn ich <li>
in footer.html auf a klicke, sollte dieses Ereignis in codeScannerController angezeigt werden.
<li class="button" ng-click="startScanner()">3</li>
Ich denke, es kann mit $on
und realisiert werden $broadcast
, aber ich weiß nicht wie und kann nirgendwo Beispiele finden.
javascript
angularjs
Alice Polansky
quelle
quelle
$scope.$apply()
ist nur erforderlich, wenn das Modell außerhalb des eckigen Frameworks geändert wird (wie in einem setTimeout, einem Dialogrückruf oder einem Ajax-Rückruf), dh$apply()
bereits ausgelöst wird, nachdem der gesamte Codeing abgeschlossen.$on()
ist.Zunächst wird eine kurze Beschreibung
$on()
,$broadcast()
und$emit()
:.$on(name, listener)
- Hört auf ein bestimmtes Ereignis durch eine bestimmtename
.$broadcast(name, args)
- Senden Sie eine Veranstaltung durch$scope
alle Kinder.$emit(name, args)
- Senden Sie ein Ereignis in der$scope
Hierarchie an alle Eltern, einschließlich der$rootScope
Basierend auf folgendem HTML (siehe vollständiges Beispiel hier ):
Die ausgelösten Ereignisse durchlaufen
$scopes
Folgendes:$scope
$scope
dann$rootScope
$scope
dann von Controller 3 gesehen$scope
$scope
dann$rootScope
$scope
$scope
2, Regler$scope
dann$rootScope
$rootScope
und$scope
von allen Controllern gesehen (1, 2, dann 3)$rootScope
JavaScript zum Auslösen von Ereignissen (auch hier sehen Sie ein funktionierendes Beispiel ):
quelle
Eine Sache, die Sie wissen sollten, ist, dass sich $ prefix auf eine Winkelmethode bezieht. $$ Präfixe beziehen sich auf Winkelmethoden, die Sie vermeiden sollten.
Im Folgenden finden Sie eine Beispielvorlage und ihre Controller. Wir werden untersuchen, wie $ Broadcast / $ On uns dabei helfen kann, das zu erreichen, was wir wollen.
Die Controller sind
Meine Frage an Sie lautet: Wie geben Sie den Namen an den zweiten Controller weiter, wenn ein Benutzer auf Registrieren klickt? Möglicherweise haben Sie mehrere Lösungen, aber die, die wir verwenden werden, ist die Verwendung von $ Broadcast und $ On.
$ Broadcast vs $ Emit
Welches sollen wir verwenden? $ Broadcast kanalisiert auf alle untergeordneten Dom-Elemente und $ emit kanalisiert die entgegengesetzte Richtung auf alle Vorfahren-Dom-Elemente.
Der beste Weg, um die Entscheidung zwischen $ emit oder $ Broadcast zu vermeiden, besteht darin, vom $ rootScope aus zu kanalisieren und $ Broadcast für alle untergeordneten Elemente zu verwenden. Das macht unseren Fall viel einfacher, da unsere Dom-Elemente Geschwister sind.
Hinzufügen von $ rootScope und Ermöglichen von $ Broadcast
Beachten Sie, dass wir $ rootScope hinzugefügt haben und jetzt $ Broadcast (BroadcastName, Argumente) verwenden. Für BroadcastName möchten wir ihm einen eindeutigen Namen geben, damit wir diesen Namen in unserer zweiten Strg abfangen können. Ich habe BOOM gewählt! nur zum Spaß. Das zweite Argument 'Argumente' ermöglicht es uns, Werte an die Listener zu übergeben.
Empfang unserer Sendung
In unserem zweiten Controller müssen wir Code einrichten, um unsere Sendung anzuhören
So einfach ist das wirklich. Live-Beispiel
Andere Möglichkeiten, um ähnliche Ergebnisse zu erzielen
Vermeiden Sie die Verwendung dieser Methodensuite, da sie weder effizient noch leicht zu warten ist. Sie können jedoch auf einfache Weise Probleme beheben, die möglicherweise auftreten.
Normalerweise können Sie dasselbe tun, indem Sie einen Dienst verwenden oder Ihre Controller vereinfachen. Wir werden dies nicht im Detail diskutieren, aber ich dachte, ich würde es der Vollständigkeit halber nur erwähnen.
Denken Sie zum Schluss daran, dass eine wirklich nützliche Sendung zum Anhören wieder '$ destroy' ist. Sie können sehen, dass $ bedeutet, dass es sich um eine Methode oder ein Objekt handelt, die von den Herstellercodes erstellt wurden. Auf jeden Fall wird $ destroy gesendet, wenn ein Controller zerstört wird. Möglicherweise möchten Sie dies anhören, um zu erfahren, wann Ihr Controller entfernt wird.
quelle
quelle