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
См. -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'
});