Wie beibehalten optionale Status-parameter auf browser-zurück in den ui-router?
Bin ich mit einem Elternteil Zustand, hat zwei Kinder Stand drinnen, dass ich zeigen werde, der einen Staat auf der Grundlage der URL
.
Aus diesen zwei states
eine ist, dass man Parameter wie param1
und param2
habe ich verwenden params
Möglichkeit, ui-router innerhalb state definition.
Zustand
$stateProvider.state('tabs.account', {
url: '/account',
views: {
'content@tabs': {
templateUrl: 'account.html',
controller: function($scope, $stateParams) {
//This params are internally used to make ajax and show some data.
$scope.param1 = $stateParams.param1;
$scope.param2 = $stateParams.param2;
},
}
},
params: {
param1: { value: null }, //this are optional param
param2: { value: null } //because they are not used in url
}
});
Wenn Sie sich auf meiner route die params-option ist nicht wirklich eingeführt, im inneren der URL
, das ist, warum ich überlege mir dann, wie optional.
Problem
Blick auf plunkr, ich habe gezeigt, zwei tabs Konto & Umfrage,
- Klicken Sie auf Survey-Registerkarte, dann fügen Sie einige Daten in die
textarea
angezeigt werden. -
Klicken Sie auf Gehen Sie zu Konto das wird passieren diejenigen
textarea
Werte
die anderen Konto tab by doingui-sref="tabs.account({param1: thing1, param2: thing2})"
auf den Anker -
Nun sehen Sie den
param1
¶m2
Werte auf html zugewiesenen Umfang von$stateParams
- Jetzt wieder Klicken Sie auf Umfrage Registerkarte, dann landest du auf der Seite Umfrage.
- Klicken Sie einfach browser, Sie werden feststellen, dass
param
Wert ist nicht immernull
.
Ich glaube, du hast was ich Fragen wollte, warum der optionale parameter Wert wurde nicht gespeichert? wie wurden Sie ein Teil des Staates.
Ich weiß, ich kann das Problem lösen, indem Sie unten zwei Lösungen.
- Werden, indem ein Dienst, der Daten zwischen zwei Ansichten.
- Durch hinzufügen von parameter in die URL Staat. wie
url: '/account/:param1/:param2',
(Aber ich würde nicht dies bevorzugen)
Ich habe bereits versucht, angular-ui-Router sticky Staaten
aber das scheint nicht, für mich zu arbeiten. Was ist der bessere Weg, um dieses?
Gibt es eine Möglichkeit, die ich machen kann, meine arbeiten, Irgendwelche Ideen wäre dankbar.
Github Problem Hier der Link
- Gerade diese github.com/angular-ui/ui-router/issues/1158 über den "Benachrichtigen" - Attribut, das gesetzt werden konnte, false, um zu verhindern, dass Ereignisse wie das Neuladen controller) aber es ist eigentlich nicht funktioniert (bug).
- danke für den Kommentar..ich werden müssen, um Uhr auf dieses Problem auch 🙁
- Haben Sie geprüft über die query params statt url-params ? Es kann arbeiten und wird ein wenig weniger seltsam in der url ('/url/route?param1=value¶m2=value')
- Vielen Dank für die Anregung, aber ich nicht wollte, zu tun, in dieser Weise..es ist im Grunde die gleiche Sache, die ich hier mache
- bitte Kommentar wenn Sie downvote..gibt es keine problem mit einer Frage?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde verschieben die
params
definition der übergeordneten Staat, so teilen Sie das optionale Zustand params zwischen Ihren beiden Kind-Staaten.Des Kindes heißt es, Erben der
$stateParams
Ihrer Eltern, so gibt es keine wirkliche "Abhilfe" gebraucht.Einfach injizieren
$stateParams
wie gewohnt in Ihrem Kind-Controller, und Sie haben vollen Zugriff auf die params werden herumgereicht. Wenn Sie nicht möchten, dass die params in einer bestimmten kindlichen Zustand, haben einfach vermeiden, Injektion.Dieser arbeitet mit;
Falls Sie zu irgendeinem Zeitpunkt möchten klar params, während Reisen innerhalb der staatlichen Struktur der
parent
müssten Sie tun, damit manuell.Wäre die nur wirkliche Nachteil den ich sehen kann mit dieser Lösung.
Ich begreife das manuelle clearing kann nicht wünschenswert sein, im Fall Sie vorhanden, aber Sie haben nicht eine aktive Stellung gegen Sie, als solche empfinde ich den Vorschlag Verdienst.
aktualisiert plunker
params
Attribut, es wäre klar sich automatisch aus, sobald Sie den übergang aus diesem Zustand Baum und dann in wieder, ohne die params für den Eintritt. Es hängt wirklich davon ab, Ihren Fall, wenn Sie brauchen, um es zu deaktivieren?Einer Abhilfe Lösung ist das Zwischenspeichern der Staat params und bedingt laden Sie bei der Eingabe der
tabs.account
Zustand. UI-Router Staat config tatsächlich können Sie eineonEnter
callback für diese Art von "etwas tun, auf in den Zustand" Situationen.Hier ist die grundlegende Logik, die mit "localStorage" als der cache, die mit arbeiten Plunker hier:
tabs.account
Zustand, überprüfen Sie Ihren Staat params$stateParams
Hier ein Beispiel-code-snippet für die Referenz (aus der Plunker):
JS:
Einer VORBEHALT ist, dass Ihr params wird anhalten auf unbestimmte Zeit (z.B. über erfrischt und Sitzungen). Um dies zu umgehen, könnte man den cache löschen auf die Anwendung laden wie in
app.run
.Ein letzter Hinweis ist, dass in der Plunker, ich bin Zugriff auf den lokalen Speicher direkt (durch die Eckigen
$window
service). Möchten Sie vielleicht nutzen, um einige AngularJS-Modul - ich habe Winkel-local-storage in der Produktion.localStorage
/sessionStorage
localStorage.clear()
(odersessionStorage.clear()
) inapp.run
. Hier ist eine aktualisierte plunkr mit Ausgleich inapp.run
und mitsessionStorage
: plnkr.co/Bearbeiten/1LFTxN?p=Album Vorhören. Wenn Sie lassen Sie mich wissen, andere Szenarien, wo würden Sie wollen, dass die Werte gelöscht, würde glücklich sein, zu gehen durch diese zu.onEnter
callback abrufen von shared service/storage/anderen cache, so dass durch die Zeit, die Sie bekommen, um Ihre state-controller, können Sie einfach die$stateParams
. Zumindest, dass Art und Weise die Besorgnis, die das fortbestehen der optionalen params ist abstrahiert aus der controller-code.Ich glaube, dass das, was Sie erreichen wollen, ist nicht möglich, ohne eine der beiden Lösung, die Sie zur Verfügung gestellt.
Den browser-zurück-Taste ist einfach, um die URL-Geschichte. Er habe keine Ahnung über den ui-router internen Zustände und einfach die Kraft, die URL zu ändern.
Zwingt die URL zu ändern, löst die interne ui-router-Maschine, aber leider auch ui-router finden Sie in der URL-änderung das gleiche als würde jemand haben, ändern Sie die url von hand.
Ui-router Feuer eine neue route zu ändern, um die Strecke wies von der URL. Das bedeuten, dass er nicht weiß, wie Sie wollte, um zu gehen "zurück" und werde nur den Status ändern, um die neue ohne Parameter.
Zusammenfassung
Klick auf zurück-button ausgelöst wird, einen Zustand zu ändern, um eine neue Staat nach der URL statt wieder auf den vorherigen Zustand.
Dies ist, warum das hinzufügen der params an die URL und das Problem lösen. Da die URL ist diskriminierend werden Sie landen schließlich auf das Land, das Sie wollten.
Hoffe, es half.
Das klingt für mich als X-Y-problem. Es gibt empfohlene Wege, um Staatliche params persistent in der Erwägung, dass das problem liegt aus dieser Oberfläche.
Durch die definition der Frage, es gibt Daten, die sollten gehalten werden, unabhängig von Staaten. So ist es Art von globaler Verhältnis zu Staaten. So sollte es werden, ein service, der hält es und Steuerungen der beiden Staaten pflegen es. Nur don ' T-pass-Daten, die aus einem Zustand des scope im Zustand params.
Sticky Staaten passen würde dieser Ansatz leicht, da es erlaubt zu halten, DOM und
$scope
während ein anderer Zustand aktiv ist. Aber es hat nichts zu tun mit Staat params, wenn der Staat wieder aktiv.account
beim Klick im Menü.