Come passare i parametri usando ui-sref in ui-router al controller


369

Ho bisogno di passare e ricevere due parametri allo stato in cui voglio passare all'utilizzo ui-srefdi ui-router.

Qualcosa come usare il link qui sotto per passare allo stato homecon fooe barparametri:

<a ui-sref="home({foo: 'fooVal', bar: 'barVal'})">Go to home state with foo and bar parameters </a>

Ricezione fooe barvalori in un controller:

app.controller('SomeController', function($scope, $stateParam) {
  //..
  var foo = $stateParam.foo; //getting fooVal
  var bar = $stateParam.bar; //getting barVal
  //..
});     

Ottengo undefinedper $stateParamnel controller.

Qualcuno potrebbe aiutarmi a capire come farlo?

Modificare:

.state('home', {
  url: '/',
  views: {
    '': {
      templateUrl: 'home.html',
      controller: 'MainRootCtrl'

    },

    'A@home': {
      templateUrl: 'a.html',
      controller: 'MainCtrl'
    },

    'B@home': {
      templateUrl: 'b.html',
      controller: 'SomeController'
    }
  }

});

5
Devi averli impostati anche nei tuoi percorsi. es: - url:'.../home/:foo/:bar
PSL,

@PSL: potresti fare solo un piccolo esempio qui? Grazie.
salta il

@PSL: Grazie PSL, c'è un altro modo in cui potrei avere quei parametri con i loro valori in un controller?
salta il

1
Esegui '/:foo/:bar': {il percorso vuoto o puoi impostare anche come querystring.
PSL,

Risposte:


531

Ho creato un esempio per mostrare come. La statedefinizione aggiornata sarebbe:

  $stateProvider
    .state('home', {
      url: '/:foo?bar',
      views: {
        '': {
          templateUrl: 'tpl.home.html',
          controller: 'MainRootCtrl'

        },
        ...
      }

E questo sarebbe il controller:

.controller('MainRootCtrl', function($scope, $state, $stateParams) {
    //..
    var foo = $stateParams.foo; //getting fooVal
    var bar = $stateParams.bar; //getting barVal
    //..
    $scope.state = $state.current
    $scope.params = $stateParams; 
})

Quello che possiamo vedere è che la home dello stato ora ha l'URL definito come:

url: '/:foo?bar',

il che significa che i parametri nell'URL sono previsti come

/fooVal?bar=barValue

Questi due collegamenti passeranno correttamente gli argomenti nel controller:

<a ui-sref="home({foo: 'fooVal1', bar: 'barVal1'})">
<a ui-sref="home({foo: 'fooVal2', bar: 'barVal2'})">

Inoltre, il controller consuma $stateParamsinvece di $stateParam.

Link al documento:

Puoi verificarlo qui

params : {}

C'è anche una nuova impostazione più granulare params : {}. Come abbiamo già visto, possiamo dichiarare i parametri come parte di url. Ma con la params : {}configurazione - possiamo estendere questa definizione o persino introdurre parametri che non fanno parte dell'URL:

.state('other', {
    url: '/other/:foo?bar',
    params: { 
        // here we define default value for foo
        // we also set squash to false, to force injecting
        // even the default value into url
        foo: {
          value: 'defaultValue',
          squash: false,
        },
        // this parameter is now array
        // we can pass more items, and expect them as []
        bar : { 
          array : true,
        },
        // this param is not part of url
        // it could be passed with $state.go or ui-sref 
        hiddenParam: 'YES',
      },
    ...

Le impostazioni disponibili per i parametri sono descritte nella documentazione di $ stateProvider

Di seguito è riportato solo un estratto

  • valore - {oggetto | funzione =} : specifica il valore predefinito per questo parametro. Questo imposta implicitamente questo parametro come opzionale ...
  • array - {boolean =}: (default: false) Se vero, il valore param sarà trattato come un array di valori.
  • squash - {bool | string =}: squash configura come un valore di parametro predefinito è rappresentato nell'URL quando il valore del parametro corrente è uguale al valore predefinito.

Possiamo chiamare questi parametri in questo modo:

// hidden param cannot be passed via url
<a href="#/other/fooVal?bar=1&amp;bar=2">
// default foo is skipped
<a ui-sref="other({bar: [4,5]})">

Controllalo in azione qui


1
Ottima risposta, ma se volessi fare una cosa del genere - <a ui-sref="profile.dashboard({aintUserId: [{{ibusUser.icdoUser.idoUser.userId}}.fm} }""> non funziona. Come posso farlo funzionare?
Fahad Mullaji,

@Radim, puoi dare un'occhiata a stackoverflow.com/questions/41429784/… e aiutarmi un po '
user203687

1
Questo è stato davvero utile! grazie per aver postato questo.
Shoukat Mirza,

1
Ottima risposta, è davvero utile. Grazie !
Venkat,

Puoi anche avere un URL come questo:url: "/:id?foo&bar"
Chicken Soup,

107

Non devi necessariamente avere i parametri all'interno dell'URL.

Ad esempio, con:

$stateProvider
.state('home', {
  url: '/',
  views: {
    '': {
      templateUrl: 'home.html',
      controller: 'MainRootCtrl'

    },
  },
  params: {
    foo: null,
    bar: null
  }
})

Sarai in grado di inviare parametri allo stato, usando:

$state.go('home', {foo: true, bar: 1});
// or
<a ui-sref="home({foo: true, bar: 1})">Go!</a>

Naturalmente, se ricarichi la pagina una volta nello homestato, perderai i parametri dello stato, poiché non vengono memorizzati da nessuna parte.

Una descrizione completa di questo comportamento è documentata qui , sotto la paramsriga nella state(name, stateConfig)sezione.


L'attributo params ha funzionato molto bene per me !!!!!! GRAZIE!! SEI UN GOOGLE EXPERT
Lucas

30

Hai semplicemente sbagliato a scrivere $stateParam, dovrebbe essere $stateParams(con una s). Ecco perché non sei definito;)


9
Generalmente questo dovrebbe essere un commento nella domanda. Ma comunque +1 per gli sforzi fatti per leggere la domanda e capire il problema :)
Anmol Saraf
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.