Ich habe eine Situation mit einem Formular, das sich über mehrere Seiten erstreckt (möglicherweise nicht ideal, aber so ist es). Ich möchte einen Bereich für das gesamte Formular haben, der im Laufe der Zeit ausgefüllt wird, damit der Benutzer sich leicht an den Status erinnert, wenn er zwischen den Schritten hin und her geht.
Also muss ich in sehr Pseudo-Code tun:
- einstellen
$scope.val = <Some dynamic data>
- Klicken Sie auf einen Link und lassen Sie sich zu einer neuen Vorlage weiterleiten (wahrscheinlich mit demselben Controller).
$scope.val
sollte immer noch den gleichen Wert haben wie auf der letzten Seite.
Sind persistente Daten für den Bereich der richtige Weg, um dies zu erreichen, oder gibt es einen anderen Weg? Können Sie sogar einen Controller erstellen, der einen dauerhaften Bereich zwischen Routen hat, außer natürlich in einer Datenbank zu speichern?
scope
routes
angularjs
controllers
Erik Honn
quelle
quelle
Antworten:
Sie müssen einen Dienst verwenden, da ein Dienst während der gesamten Lebensdauer Ihrer App bestehen bleibt.
Nehmen wir an, Sie möchten Daten eines Benutzers speichern
So definieren Sie den Service:
In Ihrem ersten Controller:
quelle
Value Recipe
docs.angularjs.org/guide/providers , wiemyApp.value('clientId', 'a12345654321x');
ist das auch zwischen den Routen beständig?Der Dienst wird funktionieren, aber eine logische Methode, um nur normale Bereiche und Controller zu verwenden, besteht darin, Ihre Controller und Elemente so einzurichten, dass sie die Struktur Ihres Modells widerspiegeln. Insbesondere benötigen Sie ein übergeordnetes Element und einen Controller, die einen übergeordneten Bereich festlegen. Die einzelnen Seiten des Formulars sollten sich in einer Ansicht befinden, die dem Elternteil untergeordnet ist. Der übergeordnete Bereich bleibt bestehen, auch wenn die untergeordnete Ansicht aktualisiert wird.
Ich gehe davon aus, dass Sie einen UI-Router verwenden, damit Sie benannte benannte Ansichten haben können. Dann im Pseudocode:
Anschließend definiert WizardController die Bereichsvariablen, die Sie in den Schritten des mehrseitigen Formulars (das ich als "Assistent" bezeichne) beibehalten möchten. Dann werden
stepView
nur Ihre Routen aktualisiert . Jeder Schritt kann seine eigenen Vorlagen, Controller und Bereiche haben, aber ihre Bereiche gehen von Seite zu Seite verloren. Die Bereiche in WizardController bleiben jedoch auf allen Seiten erhalten.Um die WizardController-Bereiche von den untergeordneten Controllern aus zu aktualisieren, müssen Sie für jede Bereichsvariable
$scope.$parent.myProp = 'value'
eine Syntax wie oder eine FunktionsetMyProp
in WizardController definieren. Wenn Sie andernfalls versuchen, die übergeordneten Bereichsvariablen direkt über die untergeordneten Controller festzulegen, erstellen Sie am Ende nur eine neue Bereichsvariable für das untergeordnete Steuerelement selbst und schattieren die übergeordnete Variable.Etwas schwer zu erklären und ich entschuldige mich für das Fehlen eines vollständigen Beispiels. Grundsätzlich möchten Sie einen übergeordneten Controller, der einen übergeordneten Bereich erstellt, der auf allen Seiten Ihres Formulars beibehalten wird.
quelle
$scope.$parent.myProp = 'hello world';
Die Daten können auf zwei Arten zwischen Controllern übertragen werden
$rootScope
Das folgende Beispiel zeigt die Übergabe von Werten mithilfe des Modells
app.js.
SharedService.js
// Ändern Sie den Wert in Controller A.
Controller.js
// Zugriff auf den Wert in controllerertwo
ControllerTwo.js
Hoffe das hilft.
quelle