Як передавати параметри за допомогою ui-sref в ui-роутері до контролера


369

Мені потрібно передати та прийняти два параметри до стану, в який я хочу перейти, використовуючи ui-srefui-роутер.

Щось подібне , використовуючи посилання нижче для переходу від держави homeз fooіbar параметрами:

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

Прийом fooіbar значення в контролері:

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

я отримав undefined за $stateParamконтролер.

Може хтось допоможе мені зрозуміти, як це зробити?

Редагувати:

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

    },

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

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

});

5
Вам також потрібно налаштувати їх на ваших маршрутах. ex: - url:'.../home/:foo/:bar
PSL

@PSL: Ви можете просто навести невеликий приклад тут? Дякую.
пропустіть

@PSL: Спасибі PSL, чи є інший спосіб, як я міг мати ці параметри зі своїми значеннями в контролері?
пропустіть

1
Виконайте '/:foo/:bar': {свій порожній маршрут, або ви також можете налаштувати як рядок запитів.
PSL

Відповіді:


531

Я створив приклад, щоб показати, як це зробити. Оновленим stateвизначенням було б:

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

        },
        ...
      }

І це був би контролер:

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

Що ми можемо побачити, це те, що державний дім зараз має URL-адресу, визначений як:

url: '/:foo?bar',

це означає, що парами в URL-адресі очікуються як

/fooVal?bar=barValue

Ці два посилання правильно передадуть аргументи в контролер:

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

Також контролер $stateParamsзамість цього споживає $stateParam.

Посилання на документ:

Ви можете перевірити це тут

params : {}

Також є нові , більш детальні налаштування params : {}. Як ми вже бачили, ми можемо оголосити параметри частиною url. Але з params : {}конфігурацією - ми можемо розширити це визначення або навіть ввести параметри, які не входять до 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',
      },
    ...

Параметри, доступні для парам, описані в документації $ stateProvider

Нижче лише витяг

  • value - {object | function =} : визначає значення за замовчуванням для цього параметра. Це неявно встановлює цей параметр як необов'язковий ...
  • array - {boolean =}: (за замовчуванням: false) Якщо true, парам-значення буде розглядатися як масив значень.
  • squash - {bool | string =}: squash налаштовує, як значення параметра параметра за замовчуванням представлено в URL-адресі, коли поточне значення параметра таке ж, як і значення за замовчуванням.

Ми можемо назвати цих парам так:

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

Перевірте це в дії тут


1
Відмінна відповідь, але що робити, якщо я хочу зробити щось подібне - <a ui-sref="profile.dashboard({aintUserId: [{{ibusUser.icdoUser.idoUser.userId}} obavez })"> це не працює. Як я можу змусити його працювати?
Фахад Мулладжи

@Radim, ти можеш поглянути на stackoverflow.com/questions/41429784/… та допомогти мені трохи
user203687

1
Це було дуже корисно! Дякуємо, що опублікували це.
Shoukat Mirza

1
Чудова відповідь, це справді корисно. Дякую !
Венкат

Ви також можете мати такий URL:url: "/:id?foo&bar"
Курячий суп

107

Вам не обов’язково мати параметри всередині URL-адреси.

Наприклад, за допомогою:

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

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

Ви зможете надіслати параметри до держави, використовуючи:

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

Звичайно, якщо ви перезавантажите сторінку один раз на homeстан, ви втратите параметри стану, оскільки вони ніде не зберігаються.

Повний опис такої поведінки задокументовано тут , під paramsрядком у state(name, stateConfig)розділі.


Атрибут params, дуже добре працював для мене !!!!!! ДЯКУЮ!! ВИ ЕКСПЕРТ GOOGLE
Лукас

30

Ви просто неправильно написали $stateParam, це має бути $stateParams(з s). Ось чому ви не визначені;)


9
Як правило, це має стати коментарем до питання. Але все одно +1 за зусилля, докладені до читання питання та розуміння проблеми :)
Anmol Saraf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.