Дополнительные параметры UL-маршрутизатора AngularJS

Я попытался настроить свою маршрутизацию следующим образом

...
url: '/view/:inboxId?'
...

но Angular выбрасывает эту ошибку:

Error: Invalid parameter name '' in pattern '/view/:inboxId?'

так что в основном мне приходилось настраивать два разных состояния:

state('view', {
            url: '/view/:inboxId',
            templateUrl: 'templates/view.html',
            controller: 'viewCtrl'
        }).

        state('view_root', {
            url: '/view',
            templateUrl: 'templates/view.html',
            controller: 'viewCtrl'
        })

Есть ли способ объединить эти состояния в один?

Ответ 1

Чтобы иметь необязательный параметр - объявите его так же, как и вы, но не передавайте его. Вот пример . То, что все могли работать с одним состоянием (без корня) или двумя (корень и детализация), как вам нравится.

Определение, упомянутое в вопросе, готово к обработке этих состояний:

// href
<a href="#/view/1">/view/1</a> - id is passed<br />
<a href="#/view/"> /view/ </a> - is is missing - OPTIONAL like <br />
<a href="#/view">  /view  </a> - url matching the view_root

// ui-sref
<a ui-sref="view({inboxId:2})">    - id is passed<br /> 
<a ui-sref="view">                 - is is missing - OPTIONAL like
<a ui-sref="view({inboxId:null})"> - id is explicit NULL <br />
<a ui-sref="view_root()">          - url matching the view_root

Нам не нужно использовать ?, чтобы отметить параметр как необязательный. Просто оба url должны быть уникальными (например, /view/:id vs /view - где второй не имеет конца /)

Ответ 2

В приведенном ниже коде можно указать поистине необязательные параметры, если вы не возражаете иметь несколько дополнительных состояний.

Я превратил свое исходное состояние в абстрактное, добавив абстрактный атрибут, а затем создал два дочерних состояния, один с URL-адресом, который имеет параметры, один с пустым URL-адресом, который ссылается на родителя.

Он хорошо работает на моем сайте-разработчике и не требует завершающего косая черта, на самом деле, если вам нужна конечная косая черта, вам нужно будет добавить состояние/когда для него.

  .state('myState.search', {
    url:'/search',
    templateUrl: urlRoot + 'components/search/search.view.html',
    controller: 'searchCtrl',
    controllerAs: 'search',
    abstract: true,
  })
  .state('myState.search.withParams', {
    url:'/:type/:field/:operator/:value',
    controller: 'searchCtrl',//copy controller so $stateParams receives the params
    controllerAs: 'search'
  })
  .state('myState.search.noParams', {
    url:''
  });