Ist es möglich, dass ein Controller einen anderen verwendet?
Zum Beispiel:
Dieses HTML-Dokument druckt einfach eine vom MessageCtrl
Controller übermittelte Nachricht in der messageCtrl.js
Datei.
<html xmlns:ng="http://angularjs.org/">
<head>
<meta charset="utf-8" />
<title>Inter Controller Communication</title>
</head>
<body>
<div ng:controller="MessageCtrl">
<p>{{message}}</p>
</div>
<!-- Angular Scripts -->
<script src="http://code.angularjs.org/angular-0.9.19.js" ng:autobind></script>
<script src="js/messageCtrl.js" type="text/javascript"></script>
</body>
</html>
Die Controller-Datei enthält den folgenden Code:
function MessageCtrl()
{
this.message = function() {
return "The current date is: " + new Date().toString();
};
}
Welches druckt einfach das aktuelle Datum;
Wenn ich einen anderen Controller hinzufügen würde, DateCtrl
der das Datum in einem bestimmten Format zurückgibt MessageCtrl
, wie würde man das tun? Das DI-Framework scheint sich mit XmlHttpRequests
Diensten zu befassen und auf diese zuzugreifen.
javascript
html
angularjs
BanksySan
quelle
quelle
Antworten:
Es gibt mehrere Möglichkeiten, zwischen Controllern zu kommunizieren.
Das Beste ist wahrscheinlich, einen Dienst zu teilen:
Ein anderer Weg ist das Aussenden eines Ereignisses zum Umfang:
In beiden Fällen können Sie auch mit jeder Direktive kommunizieren.
quelle
Siehe diese Geige: http://jsfiddle.net/simpulton/XqDxG/
Sehen Sie sich auch das folgende Video an: Kommunikation zwischen Controllern
Html:
Javascript:
quelle
Wenn Sie einen Controller in einen anderen aufrufen möchten, stehen vier Methoden zur Verfügung
Der Controller und sein Bereich können zerstört werden, aber $ rootScope bleibt in der gesamten Anwendung erhalten. Aus diesem Grund verwenden wir $ rootScope, da $ rootScope allen Bereichen übergeordnet ist.
Wenn Sie eine Kommunikation zwischen Eltern und Kind durchführen und sogar das Kind mit seinen Geschwistern kommunizieren möchte, können Sie $ Broadcast verwenden
Wenn Sie eine Kommunikation vom Kind zum Elternteil durchführen und keine Geschwister beteiligt sind, können Sie $ rootScope. $ Emit verwenden
HTML
Angularjs Code
In der obigen Codekonsole von $ emit ruft 'childEmit' nicht innerhalb von untergeordneten Geschwistern auf und es wird nur innerhalb von Eltern aufgerufen, wobei $ Broadcast auch innerhalb von Geschwistern und Eltern aufgerufen wird. Dies ist der Ort, an dem die Leistung in eine Aktion einfließt. $ Emit ist Vorzuziehen, wenn Sie die Kommunikation zwischen Kind und Eltern verwenden, da einige schmutzige Überprüfungen übersprungen werden.
Dies ist eine der besten Methoden. Wenn Sie eine Kommunikation zwischen Eltern und Kindern durchführen möchten, bei der das Kind mit den unmittelbaren Eltern kommunizieren möchte, ist keine Übertragung oder Ausgabe erforderlich. Wenn Sie jedoch eine Kommunikation zwischen Eltern und Kindern durchführen möchten, müssen Sie dies tun Verwenden Sie entweder Service oder $ Broadcast
Zum Beispiel HTML: -
Angularjs
Wenn Sie die Kommunikation zwischen Kind und Eltern verwenden, sucht Angularjs nach einer Variablen im Kind. Wenn sie im Inneren nicht vorhanden ist, werden die Werte im übergeordneten Controller angezeigt.
AngularJS unterstützt die Konzepte der "Trennung von Bedenken" mithilfe der Dienstarchitektur . Services sind Javascript-Funktionen und nur für bestimmte Aufgaben verantwortlich. Dies macht sie zu einer einzelnen Entität, die gewartet und getestet werden kann. Services, die zum Injizieren mit dem Abhängigkeitsinjektions-Mekahnismus von Angularjs verwendet werden.
Angularjs Code:
Es werden die Ausgaben Hello Child World und Hello Parent World ausgegeben. Gemäß Angular Docs of Services Singletons - Jede von einem Service abhängige Komponente erhält einen Verweis auf die einzelne Instanz, die von der Service Factory generiert wurde .
Diese Methode ruft scope () vom Element ab, indem sie die ID / unique class.angular.element () -Methode zurückgibt. Scope () gibt die $ scope-Variable einer anderen Variablen unter Verwendung der $ scope-Variablen eines Controllers in einem anderen an. Dies ist keine gute Vorgehensweise.
HTML: -
Angularjs: -
Im obigen Code zeigen Controller ihren eigenen Wert in HTML an. Wenn Sie auf Text klicken, erhalten Sie entsprechende Werte in der Konsole. Wenn Sie auf den Bereich der übergeordneten Controller klicken, wird der Wert von child und umgekehrt vom Browser konsolidiert.
quelle
Hier ist ein einseitiges Beispiel für zwei Controller, die Servicedaten gemeinsam nutzen:
Auch hier: https://gist.github.com/3595424
quelle
theService
Updates durchgeführt werdenthing.x
, wird diese Änderung automatisch auf die <Eingaben> inFirstCtrl
und übertragenSecondCtrl
, oder? Und man kann auchthing.x
direkt über einen der beiden <Eingänge> wechseln (richtig?).Wenn Sie Ereignisse senden und senden möchten, um Daten auszutauschen oder Funktionen zwischen Controllern anzurufen , sehen Sie sich bitte diesen Link an : und überprüfen Sie die Antwort mit
zbynour
(Antwort mit maximaler Stimmenzahl). Ich zitiere seine Antwort !!!Wenn der Gültigkeitsbereich von firstCtrl dem Bereich von secondCtrl übergeordnet ist, sollte Ihr Code funktionieren, indem $ emit durch $ Broadcast in firstCtrl ersetzt wird:
Falls zwischen Ihren Bereichen keine Eltern-Kind-Beziehung besteht, können Sie $ rootScope in den Controller einfügen und das Ereignis an alle untergeordneten Bereiche (dh auch secondCtrl) senden.
Wenn Sie das Ereignis vom untergeordneten Controller an Bereiche nach oben senden müssen, können Sie $ scope. $ Emit verwenden. Wenn der Bereich von firstCtrl dem Bereich von secondCtrl übergeordnet ist:
quelle
Zwei weitere Geigen: (Non-Service-Ansatz)
1) Für Eltern-Kind-Controller - Verwendung
$scope
des übergeordneten Controllers zum Senden / Senden von Ereignissen. http://jsfiddle.net/laan_sachin/jnj6y/2) Verwendung
$rootScope
über nicht verwandte Controller hinweg. http://jsfiddle.net/VxafF/quelle
Die tatsächliche Verwendung von Emit und Broadcast ist ineffizient, da das Ereignis in der Bereichshierarchie auf und ab sprudelt, was für eine komplexe Anwendung leicht zu einer Leistungsminderung führen kann.
Ich würde vorschlagen, einen Dienst zu nutzen. So habe ich es kürzlich in einem meiner Projekte implementiert - https://gist.github.com/3384419 .
Grundidee - Registrieren Sie einen Pub-Sub- / Event-Bus als Service. Fügen Sie dann diesen Ereignisbus ein, wo immer Sie Ereignisse / Themen abonnieren oder veröffentlichen müssen.
quelle
Ich kenne diesen Weg auch.
Aber ich benutze es nicht zu oft, weil ich jQuery-Selektoren nicht gerne im Winkelcode verwende.
quelle
Es gibt eine Methode, die nicht von Diensten abhängig ist,
$broadcast
oder$emit
. Es ist nicht in allen Fällen geeignet, aber wenn Sie zwei verwandte Controller haben, die in Direktiven abstrahiert werden können, können Sie dierequire
Option in der Direktivendefinition verwenden. Auf diese Weise kommunizieren ngModel und ngForm höchstwahrscheinlich. Sie können dies verwenden, um zwischen Direktiven-Controllern zu kommunizieren, die entweder verschachtelt sind oder sich auf demselben Element befinden.Für eine Eltern / Kind-Situation wäre die Verwendung wie folgt:
Und die wichtigsten Punkte, um es zum Laufen zu bringen: In der übergeordneten Direktive sollten Sie mit den aufzurufenden Methoden sie auf
this
(nicht auf$scope
) definieren:In der Definition der untergeordneten Direktive können Sie die
require
Option verwenden, damit der übergeordnete Controller an die Verknüpfungsfunktion übergeben wird (sodass Sie dann Funktionen ausscope
der untergeordneten Direktive aufrufen können .Das Obige kann unter http://plnkr.co/edit/poeq460VmQER8Gl9w8Oz?p=preview eingesehen werden
Eine Geschwisteranweisung wird ähnlich verwendet, aber beide Anweisungen beziehen sich auf dasselbe Element:
Wird verwendet, indem eine Methode erstellt wird für
directive1
:Und in Direktive2 kann dies mit der
require
Option aufgerufen werden, die dazu führt, dass der siblingController an die Link-Funktion übergeben wird:Dies kann unter http://plnkr.co/edit/MUD2snf9zvadfnDXq85w?p=preview eingesehen werden .
Die Verwendung davon?
Übergeordnet: Jeder Fall, in dem untergeordnete Elemente sich bei einem übergeordneten Element "registrieren" müssen. Ähnlich wie die Beziehung zwischen ngModel und ngForm. Diese können ein bestimmtes Verhalten hinzufügen, das sich auf Modelle auswirken kann. Möglicherweise haben Sie auch etwas rein DOM-basiertes, bei dem ein übergeordnetes Element die Positionen bestimmter untergeordneter Elemente verwalten muss, z. B. um das Scrollen zu verwalten oder darauf zu reagieren.
Geschwister: Ermöglichen, dass das Verhalten einer Direktive geändert wird. ngModel ist der klassische Fall, um der Verwendung von ngModel für Eingaben Parser / Validierung hinzuzufügen.
quelle
Ich weiß nicht, ob dies nicht den Standards entspricht, aber wenn Sie alle Ihre Controller in derselben Datei haben, können Sie Folgendes tun:
Wie Sie sehen können, ruft IndikatorenCtrl beim Aufrufen von updateCharts die updateChart-Funktionen der beiden anderen Controller auf.
quelle
Sie können den Dienst '$ controller' in Ihren übergeordneten Controller (MessageCtrl) einfügen und dann den untergeordneten Controller (DateCtrl) instanziieren / injizieren, indem Sie:
$scope.childController = $controller('childController', { $scope: $scope.$new() });
Jetzt können Sie von Ihrem untergeordneten Controller aus auf Daten zugreifen, indem Sie dessen Methoden aufrufen, da es sich um einen Dienst handelt.
Lassen Sie mich wissen, wenn ein Problem vorliegt.
quelle
Das Folgende ist ein
publish-subscribe
Ansatz, der unabhängig von Angular JS ist.Suche Param Controller
Search Choices Controller
Event Manager
Global
quelle
In Winkel 1.5 kann dies wie folgt erreicht werden:
Dies ist die übergeordnete Komponente. Hier habe ich eine Funktion erstellt, die ein anderes Objekt in mein
productForms
Array schiebt - Hinweis - dies ist nur mein Beispiel, diese Funktion kann wirklich alles sein.Jetzt können wir eine weitere Komponente erstellen, die Folgendes verwendet
require
:Hier erstellt die untergeordnete Komponente einen Verweis auf die übergeordnete Komponentenfunktion,
addNewForm
die dann an den HTML-Code gebunden und wie jede andere Funktion aufgerufen werden kann.quelle