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.
<div ng-controller="FirstCtrl">
<input ng-model="name"/>
<button ng-click="register()">Register </button>
</div>
<div ng-controller="SecondCtrl">
Registered Name: <input ng-model="name"/>
</div>
Die Controller sind
app.controller('FirstCtrl', function($scope){
$scope.register = function(){
}
});
app.controller('SecondCtrl', function($scope){
});
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
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
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
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
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.