Ich versuche, Daten zwischen Controllern auszutauschen. Der Anwendungsfall ist ein mehrstufiges Formular. Die in einem Eingang eingegebenen Daten werden später an mehreren Anzeigeorten außerhalb des ursprünglichen Controllers verwendet. Code unten und in jsfiddle hier .
HTML
<div ng-controller="FirstCtrl">
<input type="text" ng-model="FirstName"><!-- Input entered here -->
<br>Input is : <strong>{{FirstName}}</strong><!-- Successfully updates here -->
</div>
<hr>
<div ng-controller="SecondCtrl">
Input should also be here: {{FirstName}}<!-- How do I automatically updated it here? -->
</div>
JS
// declare the app with no dependencies
var myApp = angular.module('myApp', []);
// make a factory to share data between controllers
myApp.factory('Data', function(){
// I know this doesn't work, but what will?
var FirstName = '';
return FirstName;
});
// Step 1 Controller
myApp.controller('FirstCtrl', function( $scope, Data ){
});
// Step 2 Controller
myApp.controller('SecondCtrl', function( $scope, Data ){
$scope.FirstName = Data.FirstName;
});
Jede Hilfe wird sehr geschätzt.
javascript
angularjs
Johnkeese
quelle
quelle
Antworten:
Eine einfache Lösung besteht darin, dass Ihre Fabrik ein Objekt zurückgibt und Ihre Controller mit einem Verweis auf dasselbe Objekt arbeiten lassen:
JS:
HTML:
Demo: http://jsfiddle.net/HEdJF/
Wenn Anwendungen größer, komplexer und schwieriger zu testen sind, möchten Sie möglicherweise nicht das gesamte Objekt ab Werk auf diese Weise verfügbar machen, sondern nur über Getter und Setter eingeschränkten Zugriff gewähren:
Bei diesem Ansatz liegt es an den konsumierenden Controllern, die Fabrik mit neuen Werten zu aktualisieren und auf Änderungen zu achten, um diese zu erhalten:
HTML:
Demo: http://jsfiddle.net/27mk1n1o/
quelle
return { FirstName: '' };
oder ein Objekt zurückzugeben, das Methoden enthält, die mit einem Objekt interagieren, wäre es nicht vorzuziehen, eine Instanz einer Klasse (function
) zurückzugeben, damit sie bei Verwendung Ihres Objekts einen bestimmten Typ hat und nicht nur ein Objekt{}" ?newValue !== oldValue
Prüfung, da Angular die Funktion nicht ausführt, wenn oldValue und newValue identisch sind. Die einzige Ausnahme ist, wenn Sie sich um den Anfangswert kümmern. Siehe: docs.angularjs.org/api/ng/type/$rootScope.Scope#$watchIch bevorzuge es nicht dafür zu verwenden
$watch
. Anstatt den gesamten Dienst dem Bereich eines Controllers zuzuweisen, können Sie nur die Daten zuweisen.JS:
HTML:
Alternativ können Sie die Servicedaten mit einer direkten Methode aktualisieren.
JS:
quelle
Es gibt viele Möglichkeiten, wie Sie die Daten zwischen Controllern teilen können
Erklärung jeder Methode:
Ich werde es nicht erklären, wie es bereits von jemandem erklärt wurde
mit
$state.go
$stateparam
funktioniert ähnlich wie$state.go
, Sie übergeben es als Objekt vom Sender-Controller und sammeln es im Empfänger-Controller mit stateparammit
$rootscope
(a) Senden von Daten vom Kind zum übergeordneten Controller
(b) Senden von Daten vom übergeordneten zum untergeordneten Controller
quelle
Ich habe eine Factory erstellt, die den gemeinsamen Bereich zwischen dem Muster des Routenpfads steuert, sodass Sie die freigegebenen Daten nur dann verwalten können, wenn Benutzer im gleichen übergeordneten Routenpfad navigieren.
Wenn der Benutzer zu einem anderen Routenpfad wechselt, z. B. '/ Support', werden die gemeinsam genutzten Daten für Pfad '/ Kunde' automatisch zerstört. Wenn der Benutzer stattdessen zu "untergeordneten" Pfaden wie "/ Customer / 1" oder "/ Customer / list" wechselt, wird der Bereich nicht zerstört.
Ein Beispiel finden Sie hier: http://plnkr.co/edit/OL8of9
quelle
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ ... })
Sie, wenn Sie ui.routerEs gibt mehrere Möglichkeiten, Daten zwischen Controllern auszutauschen
Wie wir wissen
$rootscope
ist dies kein bevorzugter Weg für die Datenübertragung oder Kommunikation, da es sich um einen globalen Bereich handelt, der für die gesamte Anwendung verfügbar istFür den Datenaustausch zwischen Angular Js-Controllern sind Angular-Dienste Best Practices, z.
.factory
,.service
Für Referenz
Im Falle einer Datenübertragung von Eltern auf das Kind Controller können Sie direkt Zugriff Mutter Daten in Child - Controller durch
$scope
Wenn Sie verwenden ,
ui-router
dann können Sie verwenden ,$stateParmas
URL - Parameter wie passierenid
,name
,key
usw.$broadcast
Dies ist auch eine gute Möglichkeit, Daten zwischen Controllern von übergeordneten$emit
zu untergeordneten Controllern zu übertragen und Daten von untergeordneten Controllern zu übergeordneten Controllern zu übertragenHTML
JS
Weitere Informationen finden Sie unter dem angegebenen Link
$broadcast
quelle
Einfachste Lösung:
Ich habe einen AngularJS-Dienst verwendet .
Schritt 1: Ich habe einen AngularJS-Dienst namens SharedDataService erstellt.
Schritt 2: Erstellen Sie zwei Controller und verwenden Sie den oben erstellten Dienst.
Schritt 3: Verwenden Sie einfach die erstellten Controller in der Ansicht.
Um eine funktionierende Lösung für dieses Problem zu sehen, klicken Sie bitte auf den unten stehenden Link
https://codepen.io/wins/pen/bmoYLr
.html Datei:
quelle
FirstCtrl
ist Eltern und bekommt ein Versprechen, dasSecondCtrl
(Kind) auch brauchen wird? Ich möchte nicht zwei API-Anrufe tätigen. Vielen Dank.Es gibt einen anderen Weg, ohne $ watch zu verwenden, mit angle.copy:
quelle
Es gibt mehrere Möglichkeiten, dies zu tun.
Ereignisse - bereits gut erklärt.
UI-Router - oben erklärt.
* *
* *
quelle
Ich bin mir nicht sicher, wo ich dieses Muster aufgegriffen habe, aber um Daten zwischen Controllern auszutauschen und $ rootScope und $ scope zu reduzieren, funktioniert dies hervorragend. Es erinnert an eine Datenreplikation, bei der Sie Herausgeber und Abonnenten haben. Ich hoffe es hilft.
Der Service:
Der Controller, der die neuen Daten erhält, also der Publisher, würde so etwas tun.
Der Controller, der auch diese neuen Daten verwendet, die als Abonnent bezeichnet werden, würde so etwas tun ...
Dies funktioniert für jedes Szenario. Wenn der primäre Controller initialisiert wird und Daten erhält, ruft er die changeData-Methode auf, die diese dann an alle Abonnenten dieser Daten sendet. Dies reduziert die Kopplung unserer Steuerungen aneinander.
quelle
sharedDataEventHub.changeData(newData)
sharedDataEventHub.changeData(newData)
dann das untergeordnete Element oder den Controller, der von diesen Daten abhängt, irgendwo in seinem Controller-Körper:sharedDataEventHub.onChangeData($scope, function(obj) { vm.myObject = obj.data; });
Wenn Sie die Benutzeroberfläche verwendet haben -Router Dies könnte aus der Statuskonfiguration eingefügt werden.Mach es einfach (getestet mit v1.3.15):
quelle
dummy
ist für beide Controller global und wird nicht modularer durch Vererbung mit $ scope oder controllerAs oder mithilfe eines Dienstes gemeinsam genutzt.