Маршрутизатор 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.