Come passare un oggetto in uno stato utilizzando il router UI?


119

Mi piacerebbe essere in grado di passare a uno stato e passare un oggetto arbitrario usando ui-router.

Sono consapevole che di solito $stateParamsviene utilizzato, ma credo che questo valore sia inserito nell'URL e non voglio che gli utenti siano in grado di aggiungere questi dati ai segnalibri.

Mi piacerebbe fare qualcosa di simile.

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

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

C'è un modo per farlo senza codificare i valori nell'URL?


1
I meccanismi ui-router preservano gli stati dell'URL durante la navigazione. Pertanto, se un utente aggiorna la pagina, torna alla pagina in cui si trovava. Se non desideri utilizzare questo comportamento, considera l'utilizzo di altri meccanismi (funzioni grezze nel tuo controller / direttive, ecc.) E utilizza i cookie / archiviazione per la memorizzazione di dati temporanei
Neozaru

Forse usi localStorage con l'URL come chiave per i tuoi dati?
Neil

2
Da dove vengono i valori? Ui.router ha il concetto di una "risoluzione" per caricare i dati in un ambito prima di passare allo stato richiesto. Allo stesso modo ci sono metodi onEnter e onExit. Inoltre, puoi utilizzare l'archiviazione locale.
Josh C.

Come @JoshC. menzionato, sembra che tu voglia esaminare la risoluzione dei dati prima di passare a uno stato. github.com/angular-ui/ui-router/wiki#resolve
TrazeK

Vedi la risposta di stackOverlord su come farlo ufficialmente.
AlikElzin-kilaka

Risposte:


163

Nella versione 0.2.13, dovresti essere in grado di passare oggetti in $ state.go,

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

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

e quindi accedere al parametro nel controller.

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

myParam non verrà visualizzato nell'URL.

Fonte:

Vedi il commento di christopherthielen https://github.com/angular-ui/ui-router/issues/983 , riprodotto qui per comodità:

christopherthielen: Sì, dovrebbe funzionare ora nella versione 0.2.13.

.state ('foo', {url: '/ foo /: param1? param2', params: {param3: null} // null è il valore predefinito});

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

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

l'URL è / foo / bar? param2 = baz.


Funziona anche con transitionTo.
AlikElzin-kilaka

13
Devo fare qualcosa di sbagliato: - / Sono su 0.2.13 ma se tento di passare e obiettare, viene fuori nello stato come stringa[object Object]
ErichBSchulz

15
@ErichBSchulz Sebbene non sia incluso in questa risposta, il trucco per farlo funzionare è includere il nome del parametro nella stringa dell'URL dello stato e specificare il tipo come JSON. ex. $stateProvider.state('myState', { url: '/myState/{myParam:json}', params: {myParam: null},...Vedere le note sulla versione 0.2.13 e i commenti sul codice per questa funzione.
Syon

1
Avevo un id param nel mio URL e ho dovuto aggiungerlo anche all'oggetto params. { url: '/mystate/{id:[0-9]+}', params: { id: null, myParam: null }, ...
GraehamF

3
Deve esserci un po 'di magia nera in gioco - tutto il mio json sta mostrando l'url: (((
Kabachok

25

Ci sono due parti di questo problema

1) utilizzando un parametro che non altererebbe un URL (utilizzando la proprietà params):

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

2) passare un oggetto come parametro: Bene, non c'è un modo diretto per farlo ora, poiché ogni parametro viene convertito in stringa ( EDIT : dalla 0.2.13, questo non è più vero - puoi usare gli oggetti direttamente), ma puoi aggirare il problema creando la stringa da solo

toParamsJson = JSON.stringify(toStateParams);

e nel controller di destinazione deserializzare nuovamente l'oggetto

originalParams = JSON.parse($stateParams.toParamsJson);

1
In realtà per passare oggetti questo è un bel trucco :)
Tek

possiamo passare l'oggetto direttamente. controlla la risposta accettata
Kishore Relangi

20

In realtà puoi farlo.

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

Questa è la documentazione ufficiale sulle opzioni in state.go

Tutto è descritto lì e come puoi vedere questo è il modo per farlo.


Ho provato questo codice esatto e l'oggetto non è stato preservato.
Virmundi

1
non puoi passare oggetti puoi passare solo valori di un singolo parametro .... se lo fai come un oggetto devi mettere tutte le proprietà come diversi parametri url. Gli sviluppatori di Angular-ui-router stanno ancora lavorando sul passaggio dell'intero oggetto. In realtà quei ragazzi Svatopluk Ledl hanno dato una bella soluzione. Basta creare l'oggetto come una stringa json intera e quindi analizzarlo. :)
Tek

13

A proposito, puoi anche usare l'attributo ui-sref nei tuoi modelli per passare oggetti

ui-sref="myState({ myParam: myObject })"

1
Come riceviamo questo oggetto in .state
Shubham

@Shubham configureresti i 'params' per lo stato che riceverà l'oggetto, quindi usando $ stateParams per recuperare quell'oggetto. vedere il documento angular-ui.github.io/ui-router/site/#/api/… per i dettagli.
tao

funziona ma non può mantenere i dati dopo l'aggiornamento della pagina.
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));


    })

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.