Ui-router: избегайте href rebuild при обнаружении необязательных параметров - PullRequest
0 голосов
/ 17 июня 2019

Я разрабатываю проект с angularJS и ui-router для управления состояниями страниц.Для упрощения общая архитектура: страницы (состояния ui-маршрутизатора) разделены между «модулями» (тематическое расположение) следующим образом.

root
  -> module1
    -> state1
    -> state2
  -> module2
    -> state1
    -> state2
  • root, module1и module2 являются абстрактными (но с ними связана часть URL).

  • root.module1.state1 и root.module2.state2 должны иметь необязательный параметр в начале URL для контекста.

Идея состоит в том, чтобы создать следующие URL-адреса для контекстов:

root.module1.state1 : /#/:contextId/module1/state1
root.module1.state2 : /#/module1/state2
root.module2.state1 : /#/module2/state1
root.module2.state2 : /#/:contextId/module2/state2

Настройка поставщика реестра:

var root = {
    name: 'root',
    abstract: true,
    url: '/:contextId',
    params :{
        contextId: {value:null, squash: true}
    }
};

var module1 = {
    name: 'module1',
    parent: 'root',
    abstract: true,
    url: '/module1'
};

var module2 = {
    name: 'module2',
    parent: 'root',
    abstract: true,
    url: '/module2'
};

var mod1_state1 = {
    name: 'module1.state1',
    url: '/state1'
};

var mod1_state2 = {
    name: 'module1.state2',
    url: '/state2'
};

var mod2_state1 = {
    name: 'module2.state1',
    url: '/state1'
};

var mod2_state2 = {
    name: 'module2.state2',
    url: '/state2'
};

$stateRegistryProvider.register(root);
$stateRegistryProvider.register(module1);
$stateRegistryProvider.register(module2);
$stateRegistryProvider.register(mod1_state1);
$stateRegistryProvider.register(mod1_state2);
$stateRegistryProvider.register(mod2_state1);
$stateRegistryProvider.register(mod2_state2);

Ссылки основаныдля динамических значений, таких как:

<a ui-sref="module1.state1({contextId: $ctrl.contextId})">State 1</a>

Отлично работает при первой загрузке (сгенерированные hrefs для всех состояний хороши), но как только я обращаюсь к состоянию с contextId в URL (разрешение значения),все ссылки преобразуются в /#/:contextId/moduleX/stateX.

Есть ли способ избежать этого?И сохранить исходные сгенерированные ссылки на то, что они были при первой загрузке?

Или я что-то упускаю / есть другой способ добиться этого?

Примечание: пример только для иллюстрации того, чтоЯ пытаюсь достичь, но фактический проект намного больше, чем это.Следующие пункты невозможны:

  • перемещение состояний между модулями
  • дублирование кода на все модули или состояния, для которых требуется contextId
...