Маршрутизатор AngularJS ui передає дані між станами без URL-адреси


146

Я зіткнувся з цією проблемою передачі даних між двома станами, не виставляючи даних у URL-адресі, наче користувач не може реально безпосередньо приземлитися на цей стан.

Наприклад. У мене є два стани "А" і "В". Я роблю деякий виклик сервера в стані "А" і передаю відповідь на дзвінок в стан "В". Відповідь на виклик сервера - це рядкове повідомлення, яке досить довге, тому я не можу викрити це в URL-адресі.

Так чи є в кутовому інтерфейсі маршрутизатора будь-який спосіб передавати дані між станами, не використовуючи параметри URL-адреси?

Відповіді:


185

Ми можемо використовувати params, нову особливість UI-маршрутизатор:

API Reference / ui.router.state / $ stateProvider

paramsКарта, яка необов'язково налаштовує параметри, оголошені в URL-адресі, або визначає додаткові параметри, що не стосуються URL-адреси. Для кожного параметру, який налаштовується, додайте об’єкт конфігурації, введений у назву параметра.

Дивіться частину: " ... або визначає додаткові параметри, що не стосуються URL ... "

Отже, державна дефініція буде такою:

$stateProvider
  .state('home', {
    url: "/home",
    templateUrl: 'tpl.html',
    params: { hiddenOne: null, }
  })

Кілька прикладів формують документ, зазначений вище :

// define a parameter's default value
params: {
  param1: { value: "defaultValue" }
}
// shorthand default values
params: {
  param1: "defaultValue",
  param2: "param2Default"
}

// param will be array []
params: {
  param1: { array: true }
}

// handling the default value in url:
params: {
  param1: {
    value: "defaultId",
    squash: true
} }
// squash "defaultValue" to "~"
params: {
  param1: {
    value: "defaultValue",
    squash: "~"
  } }

EXTEND - приклад роботи: http://plnkr.co/edit/inFhDmP42AQyeUBmyIVl?p=info

Ось приклад визначення стану:

 $stateProvider
  .state('home', {
      url: "/home",
      params : { veryLongParamHome: null, },
      ...
  })
  .state('parent', {
      url: "/parent",
      params : { veryLongParamParent: null, },
      ...
  })
  .state('parent.child', { 
      url: "/child",
      params : { veryLongParamChild: null, },
      ...
  })

Це може бути дзвінок за допомогою ui-sref:

<a ui-sref="home({veryLongParamHome:'Home--f8d218ae-d998-4aa4-94ee-f27144a21238'
  })">home</a>

<a ui-sref="parent({ 
    veryLongParamParent:'Parent--2852f22c-dc85-41af-9064-d365bc4fc822'
  })">parent</a>

<a ui-sref="parent.child({
    veryLongParamParent:'Parent--0b2a585f-fcef-4462-b656-544e4575fca5',  
    veryLongParamChild:'Child--f8d218ae-d998-4aa4-94ee-f27144a61238'
  })">parent.child</a>

Перевірте приклад тут


Як було запропоновано, я спробував використовувати парами у вкладеному стані (Приклад - "/ користувач / профіль / контакти", це дало мені деяку помилку. Чи потрібно мені також визначити "парами" для батьківського стану?
vijay tiagi

Здається, не потрібно мати батьків, щоб вони визначали параметри, дякую за детальну відповідь.
vijay tiagi

Чудово, якщо це допоможе так чи інакше;) насолоджуватися могутнім інтерфейсом маршрутизатора
Радім Келер

1
На жаль, це не працює з ui-роутером 0.2.10, і це те, що я використовую, отримала цю помилку при зміні версії на 0,2.10 - Помилка: Недійсні парами у державному "домі"
vijay tiagi

1
@vijaytyagi, вам слід оновити. Просто немає ніяких причин продовжувати працювати стару версію. І наскільки я пам’ятаю, хода повинна бути плавною ...
Радім Келер

38

Об'єкт params включений у $ stateParams, але не буде частиною URL-адреси.

1) У конфігурації маршруту:

$stateProvider.state('edit_user', {
    url: '/users/:user_id/edit',
    templateUrl: 'views/editUser.html',
    controller: 'editUserCtrl',
    params: {
        paramOne: { objectProperty: "defaultValueOne" },  //default value
        paramTwo: "defaultValueTwo"
    }
});

2) У контролері:

.controller('editUserCtrl', function ($stateParams, $scope) {       
    $scope.paramOne = $stateParams.paramOne;
    $scope.paramTwo = $stateParams.paramTwo;
});

3A) Зміна стану від контролера

$state.go("edit_user", {
    user_id: 1,                
    paramOne: { objectProperty: "test_not_default1" },
    paramTwo: "from controller"
});

3B) Зміна стану в html

<div ui-sref="edit_user({ user_id: 3, paramOne: { objectProperty: 'from_html1' }, paramTwo: 'fromhtml2' })"></div>

Приклад Plunker


1
Дякую, ідеально. Також зауважив, що якщо ви хочете як $ state, так і $ stateParams, вам потрібно лише ввести $ state. Об'єкт stateParams є властивістю $ state: $ state.params.
Майкл К

1
Потрібно сказати, що крок 1 (надання значень за замовчуванням) необхідний, щоб інші працювали ;-)
Xtreme Biker

2
Дякую за стислий приклад. Для мене працює! (UI-Router v 1.0.3)
Roboprog
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.