Доступ к параметрам из дочерних состояний ui-router

0

В документации говорится, что:

Дочерние состояния DO наследуют следующее из родительских состояний:

Разрешенные зависимости через разрешение

Пользовательские свойства данных

Ничто другое не наследуется (нет контроллеров, шаблонов, URL-адресов и т.д.). Однако дети абстрактных состояний наследуют свойство url своего родителя как префикс своего собственного URL-адреса.

означает ли это, что в моем дочернем состоянии у меня будет возможность анализировать целую строку запроса?

например, если у меня есть следующая иерархия состояний:

$stateProvider
  .state('contacts', {
    url: 'contacts/:contactId',
    abstract: true,
    /* ... */
  })
  .state('contacts.details', {
    url: '/details',
    controller: 'ContactDetailsController',
    /* ... */
  });

Будет ли введенный $stateParams в ContactDetailsController иметь доступ к contactId который предназначен для захвата в состоянии аннотации contacts?

  • 0
    Вы пробовали это? Если да, то где работает пример?
  • 1
    да, если ваш URL заканчивается contacts/1/details , вы можете получить contactId используя $ stateParams в ContactDetailsController
Показать ещё 1 комментарий
Теги:
angular-ui-router

1 ответ

0

Найден ответ в документации:

Важные $ stateParams Gotcha

В контроллерах $stateParams объект $stateParams будет содержать только те параметры, которые были зарегистрированы в этом состоянии. Таким образом, вы не увидите параметров, зарегистрированных в других штатах, включая предков.

$stateProvider.state('contacts.detail', {
   url: '/contacts/:contactId',   
   controller: function($stateParams){
      $stateParams.contactId  //*** Exists! ***//
   }
}).state('contacts.detail.subitem', {
   url: '/item/:itemId', 
   controller: function($stateParams){
      $stateParams.contactId //*** Watch Out! DOESN'T EXIST!! ***//
      $stateParams.itemId //*** Exists! ***//  
   }
})

Вместо этого используйте оператор разрешения в родительском маршруте.

$stateProvider.state('contacts.detail', {
   url: '/contacts/:contactId',   
   controller: function($stateParams){
      $stateParams.contactId  //*** Exists! ***//
   },
   resolve:{
      contactId: ['$stateParams', function($stateParams){
          return $stateParams.contactId;
      }]
   }
}).state('contacts.detail.subitem', {
   url: '/item/:itemId', 
   controller: function($stateParams, contactId){
      contactId //*** Exists! ***//
      $stateParams.itemId //*** Exists! ***//  
   }
})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню