Comment passer des paramètres en utilisant ui-sref dans ui-router au contrôleur

J'ai besoin de passer et de recevoir deux paramètres à l'état vers lequel je veux transiter en utilisant ui-sref de ui-router.

Quelque chose comme l'utilisation du lien ci-dessous pour la transition de l'État à home avec foo et bar paramètres:

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

Réception des valeurs foo et bar dans un contrôleur:

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

Je reçois undefined pour $stateParam dans le contrôleur.

Quelqu'un Pourrait m'aider à comprendre comment la faire?

Modifier:

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

    },

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

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

});
345
demandé sur Radim Köhler 2014-09-03 18:50:39

3 réponses

, j'ai créé un exemple, pour montrer comment. Mise à jour state définition serait:

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

        },
        ...
      }

Et ce serait le contrôleur:

.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; 
})

Ce que nous pouvons voir, c'est que le State home a maintenant une url définie comme:

url: '/:foo?bar',

Ce Qui signifie que les paramètres dans l'url sont attendus

/fooVal?bar=barValue

Ces deux liens passeront correctement les arguments dans le contrôleur:

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

En outre, le contrôleur consomme $stateParams au lieu de $stateParam.

Lien vers doc:

Vous pouvez le vérifier ici

params : {}

Il est également nouveaux, plus granulaire de réglage params : {}. Comme nous l'avons déjà vu, nous pouvons déclarer des paramètres dans le cadre de url. Mais avec params : {} configuration - nous pouvons étendre cette définition ou même introduire des paramètres qui ne font pas partie de l'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',
      },
    ...

Les Paramètres disponibles pour les paramètres sont décrits dans la documentation du $stateProvider

Ci-dessous est juste un extrait

  • valeur {objet|fonction=}: spécifie la valeur par défaut pour ce paramètre. Cela définit implicitement ce paramètre comme facultatif...
  • array - {boolean=}: (par défaut: false) si true, la valeur param sera traitée comme un tableau de valeurs.
  • squash - {bool|string=}: squash configure la façon dont une valeur de paramètre par défaut est représentée dans L'URL lorsque valeur de paramètre actuelle est la même que la valeur par défaut.

Nous pouvons appeler ces paramètres de cette façon:

// 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]})">

Vérifier dans l'action ici

509
répondu Radim Köhler 2015-05-11 18:56:18

Vous n'avez pas nécessairement besoin d'avoir les paramètres à l'intérieur de L'URL.

Par exemple, avec:

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

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

Vous pourrez envoyer des paramètres à l'état, en utilisant soit:

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

Bien sûr, si vous rechargez la page une fois sur l'état home, vous perdrez les paramètres d'état, car ils ne sont stockés nulle part.

Une description complète de ce comportement est documentée ici, Sous la ligne params dans la section state(name, stateConfig).

102
répondu Paul Mougel 2015-04-22 11:42:47

Vous avez simplement mal orthographié $stateParam, Il devrait être $stateParams (avec un s). C'est pourquoi vous obtenez undefined ;)

26
répondu felixfbecker 2015-08-10 13:32:46