Подтвердить что ты не робот

Angular - UI Router - программно добавляет состояния

Есть ли способ программно добавлять состояния в $stateProvider после конфигурации модуля, например. оказание услуг?

Чтобы добавить больше контекста к этому вопросу, у меня есть ситуация, когда я могу пойти с двумя подходами:

  • попробуйте принудительно перезагрузить состояние, определенное в конфигурации модуля, проблема в том, что состояние reloadOnSearch установлено на false, поэтому, когда я пытаюсь $state. go ('state.name', {new: param}, {reload: true}); ничего не происходит, любые идеи?

Определение состояния

.state('index.resource.view', {
  url: "/:resourceName/view?pageNumber&pageSize&orderBy&search",
  templateUrl: "/resourceAdministration/views/view.html",
  controller: "resourceViewCtrl",
  reloadOnSearch: false,
})
  1. попробуйте программно добавить состояния, которые мне нужно загрузить из службы, чтобы маршрутизация могла работать правильно. Я предпочел бы пойти с первым вариантом, если это возможно.
4b9b3361

Ответ 1

См. -edit- для обновленной информации

Нормальные состояния добавляются к $stateProvider во время фазы конфигурации. Если вы хотите добавить состояния во время выполнения, вам нужно сохранить ссылку на $stateProvider.

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

// config-time dependencies can be injected here at .provider() declaration
myapp.provider('runtimeStates', function runtimeStates($stateProvider) {
  // runtime dependencies for the service can be injected here, at the provider.$get() function.
  this.$get = function($q, $timeout, $state) { // for example
    return { 
      addState: function(name, state) { 
        $stateProvider.state(name, state);
      }
    }
  }
});

Я реализовал некоторые вещи под названием Будущие государства в Дополнительные возможности UI-Router, которые заботятся о некоторых из угловые случаи для вас, как отображение URL-адресов в состояниях, которые еще не существуют. Будущие государства также показывают, как вы можете ленить загрузить исходный код для состояний выполнения. Взгляните на исходный код, чтобы понять, что с ним связано.

-edit- для UI-Router 1.0 +

В UI-Router 1.0 состояния могут быть зарегистрированы и занесены в учетную запись во время выполнения, используя StateRegistry.register и StateRegistry.deregister.

Чтобы получить доступ к StateRegistry, введите его $stateRegistry или введите $uiRouter и получить доступ к нему через UIRouter.stateRegistry.

UI-Router 1.0 также включает в себя Будущие государства из коробки, которая обрабатывает ленивую загрузку определений состояний, даже синхронизируя по URL-адресу.

Ответ 2

Крис Т прибил его! Поставщик - это путь. Вам не нужно ударять его по объекту окна, сохранять, защищать и т.д.

Перекрестная ссылка на его ответ с этой статьей действительно помогла: http://blog.xebia.com/2013/09/01/differences-between-providers-in-angularjs/#provider

Решение делает определенные модули $stateProvider во время блока конфигурации доступными для других модулей во время их блоков выполнения.

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

В моем блоке конфигурации мой провайдер настроен, передавая модуль stateProvider (для доступа к нему позже).

//in dashboard.module.js

var dashboardModule = angular.module('app.modules.dashboard',[
        'app.modules.dashboard.controllers',
        'app.modules.dashboard.services',
        'app.modules.dashboard.presentations.mileage'
    ])

    .provider('$dashboardState', function($stateProvider){
        this.$get = function(PATHS, $state){
            return {
                addState: function(title, controllerAs, templatePrefix) {
                    $stateProvider.state('dashboard.' + title, {
                        url: '/' + title,
                        views: {
                            '[email protected]': {
                                templateUrl: PATHS.DASHBOARD + (templatePrefix ? templatePrefix + '/' : '/') + title + '/' + title + '.view.html',
                                controller: controllerAs ? controllerAs : null
                            }
                        }
                    });
                }
            }
        }
    });

Ответ 3

Да, это возможно, но потому, что в них задействованы слои кеширования. Алекс Фейнберг зарегистрировал решение в своем блоге здесь:

http://alexfeinberg.wordpress.com/2014/03/08/dynamically-populating-angular-ui-router-states-from-a-service/

Концевой конец статьи включает пример создания состояния с помощью stateProvider:

app.stateProvider.state(ent.lob.name.toLowerCase(), {
    url: '/' + ent.lob.name.toLowerCase(),
    controller: ent.lob.name.toLowerCase() + 'Controller',
    templateUrl: 'lobs/views/' + ent.lob.name.toLowerCase() + '.html'
});