Wie übergebe ich ein Objekt mit dem UI-Router in einen Zustand?

119

Ich möchte in der Lage sein, in einen Zustand überzugehen und ein beliebiges Objekt mit dem UI-Router zu übergeben.

Ich bin mir bewusst, dass dies normalerweise $stateParamsverwendet wird, aber ich glaube, dass dieser Wert in die URL eingefügt wird, und ich möchte nicht, dass Benutzer diese Daten mit Lesezeichen versehen können.

Ich würde gerne so etwas machen.

$state.transitionTo('newState', {myObj: {foo: 'bar'}});

function myCtrl($stateParams) {
   console.log($stateParams.myObj); // -> {foo: 'bar'}
};

Gibt es eine Möglichkeit, dies zu tun, ohne Werte in die URL zu kodieren?

Eddiec
quelle
1
UI-Router-Mechanismen behalten URL-Zustände in der Navigation bei. Wenn ein Benutzer die Seite aktualisiert, kehrt er zu der Seite zurück, auf der er sich befand. Wenn Sie dieses Verhalten nicht verwenden möchten, sollten Sie andere Mechanismen (Rohfunktionen in Ihrem Controller / Ihren Anweisungen usw.) verwenden und Cookies verwenden. Speicher zum Speichern temporärer Daten
Neozaru
Verwenden Sie localStorage mit der URL als Schlüssel für Ihre Daten?
Neil
2
Woher kommen die Werte? Ui.router hat das Konzept einer "Auflösung", um Daten in einen Bereich zu laden, bevor in den angeforderten Zustand übergegangen wird. Ebenso gibt es die Methoden onEnter und onExit. Darüber hinaus können Sie lokalen Speicher verwenden.
Josh C.
Als @JoshC. Es hört sich so an, als ob Sie sich mit dem Auflösen von Daten befassen möchten, bevor Sie in einen Status wechseln. github.com/angular-ui/ui-router/wiki#resolve
TrazeK
In der Antwort von stackOverlord erfahren Sie, wie Sie dies offiziell tun.
AlikElzin-kilaka

Antworten:

163

In Version 0.2.13 sollten Sie in der Lage sein, Objekte an $ state.go zu übergeben.

$state.go('myState', {myParam: {some: 'thing'}})

$stateProvider.state('myState', {
                url: '/myState/{myParam:json}',
                params: {myParam: null}, ...

und greifen Sie dann auf den Parameter in Ihrer Steuerung zu.

$stateParams.myParam //should be {some: 'thing'}

myParam wird nicht in der URL angezeigt.

Quelle:

Siehe den Kommentar von christopherthielen https://github.com/angular-ui/ui-router/issues/983 , der hier zur Vereinfachung wiedergegeben ist:

christopherthielen: Ja, das sollte jetzt in 0.2.13 funktionieren.

.state ('foo', {url: '/ foo /: param1? param2', params: {param3: null} // null ist der Standardwert});

$ state.go ('foo', {param1: 'bar', param2: 'baz', param3: {id: 35, name: 'what'}});

$ stateParams in 'foo' ist jetzt {param1: 'bar', param2: 'baz', param3: {id: 35, name: 'what'}}

URL ist / foo / bar? param2 = baz.

stackOverlord
quelle
Funktioniert auch mit transitionTo.
AlikElzin-Kilaka
13
Ich muss etwas falsch machen: - / Ich bin am 0.2.13, aber wenn ich versuche zu übergeben und zu widersprechen, kommt es im Zustand als String heraus[object Object]
ErichBSchulz
15
@ErichBSchulz Obwohl es in dieser Antwort nicht enthalten ist, besteht der Trick, damit dies funktioniert, darin, den Parameternamen in die URL-Zeichenfolge des Status aufzunehmen und den Typ als JSON anzugeben. Ex. $stateProvider.state('myState', { url: '/myState/{myParam:json}', params: {myParam: null},...Siehe die Versionshinweise zu 0.2.13 und die Codekommentare zu dieser Funktion.
Syon
1
Ich hatte einen ID-Parameter in meiner URL und musste diesen auch zum params-Objekt hinzufügen. { url: '/mystate/{id:[0-9]+}', params: { id: null, myParam: null }, ...
GraehamF
3
Es muss etwas schwarze Magie im Spiel sein - mein ganzer Sohn zeigt die URL: ((
Kabachok
25

Es gibt zwei Teile dieses Problems

1) Verwenden eines Parameters, der eine URL nicht ändert (mithilfe der Eigenschaft params):

$stateProvider
    .state('login', {
        params: [
            'toStateName',
            'toParamsJson'
        ],
        templateUrl: 'partials/login/Login.html'
    })

2) , die ein Objekt als Parameter: Nun, es gibt keinen direkten Weg , wie man es jetzt tun, wie jeder Parameter in einem String umgewandelt wird ( EDIT : seit 0.2.13, ist dies nicht mehr wahr - Sie können Objekte direkt) verwenden, aber Sie können dies umgehen, indem Sie die Zeichenfolge selbst erstellen

toParamsJson = JSON.stringify(toStateParams);

und in der Zielsteuerung das Objekt erneut deserialisieren

originalParams = JSON.parse($stateParams.toParamsJson);
Svatopluk Ledl
quelle
1
Eigentlich für das Übergeben von Objekten ist dies ein ziemlich netter Hack :)
Tek
wir können Objekt direkt übergeben. Überprüfen Sie die akzeptierte Antwort
Kishore Relangi
20

Eigentlich kannst du das machen.

$state.go("state-name", {param-name: param-value}, {location: false, inherit: false});

Dies ist die offizielle Dokumentation zu Optionen in state.go

Dort wird alles beschrieben, und wie Sie sehen, ist dies der richtige Weg.

Tek
quelle
Ich habe genau diesen Code ausprobiert und das Objekt bleibt nicht erhalten.
Virmundi
1
Sie können keine Objekte übergeben. Sie können nur einzelne Parameterwerte übergeben. Um ein Objekt zu erstellen, müssen Sie alle Eigenschaften als unterschiedliche URL-Parameter festlegen. Angular-UI-Router-Entwickler arbeiten immer noch daran, das gesamte Objekt zu übergeben. Eigentlich haben die Jungs Svatopluk Ledl eine schöne Lösung gegeben. Erstellen Sie einfach das Objekt als ganzen JSON-String und analysieren Sie es anschließend. :)
Tek
13

Übrigens können Sie auch das Attribut ui-sref in Ihren Vorlagen verwenden, um Objekte zu übergeben

ui-sref="myState({ myParam: myObject })"
rauben
quelle
1
Wie erhalten wir dieses Objekt in .state
Shubham
@Shubham Sie würden die 'Parameter' für den Status konfigurieren, der das Objekt empfangen soll, und dann $ stateParams verwenden, um dieses Objekt abzurufen. Weitere Informationen finden Sie im Dokument angle-ui.github.io/ui-router/site/#/api/… .
Tao
Dies funktioniert, kann jedoch die Daten nach der Seitenaktualisierung nicht beibehalten.
Tao
9

1)

$stateProvider
        .state('app.example1', {
                url: '/example',
                views: {
                    'menuContent': {
                        templateUrl: 'templates/example.html',
                        controller: 'ExampleCtrl'
                    }
                }
            })
            .state('app.example2', {
                url: '/example2/:object',
                views: {
                    'menuContent': {
                        templateUrl: 'templates/example2.html',
                        controller: 'Example2Ctrl'
                    }
                }
            })

2)

.controller('ExampleCtrl', function ($state, $scope, UserService) {


        $scope.goExample2 = function (obj) {

            $state.go("app.example2", {object: JSON.stringify(obj)});
        }

    })
    .controller('Example2Ctrl', function ($state, $scope, $stateParams) {

        console.log(JSON.parse($state.params.object));


    })
vrbsm
quelle
3

Nein, die URL wird immer aktualisiert, wenn Parameter an übergeben werden transitionTo.

Dies geschieht auf state.js: 698 im UI -Router .

Nachmittag
quelle