Я установил контроллер верхнего уровня, который создается только тогда, когда обещание (возвращаемое Config
factory) успешно разрешено. Это обещание в основном загружает конфигурацию веб-приложения с конечными точками RESTful и т.д.
$stateProvider
.state('app', {
url: '/',
templateUrl: 'views/_index.html',
controller: 'MainCtrl',
resolve: {
config: 'Config'
}
});
Эта настройка позволяет мне утверждать, что конфигурация должным образом загружена до того, как какой-либо более низкий контроллер получит возможность ее использовать.
Теперь мне нужно добавить в более глубокий вложенный контроллер еще один factory
, который использует Config
и работает только тогда, когда он разрешен (посмотрите на него как на упаковку $resource
, которая нуждается в некоторых URL-адресах веб-сервисов). Если я это сделаю:
$stateProvider
.state('app.bottom.page', {
url: '/bottom/page',
templateUrl: 'views/_a_view.html',
controller: 'BottomLevelCtrl',
resolve: {
TheResource: 'MyConfigDependingResource'
}
});
похоже, что порядок оценки resolve
не соответствует иерархии контроллера сверху вниз, а снизу вверх, поэтому:
-
app.bottom.page
-
ui-router
пытается разрешитьMyConfigDependingResource
, но инъекция терпит неудачу, потому чтоConfig
никогда не инициализировался - Разрешение
ui-router
прекращается из-за ошибки (даже не выбрасываяError
s, но эта другая проблема), аConfig
никогда не инициализируется контроллером верхнего уровня
Почему ui-router
разрешает зависимости в обратном порядке? Как я могу легко разрешить мой TheResource
объект после, верхний уровень MainCtrl
разрешил Config
(не полагаясь на $inject
, конечно)?
UPDATE: от этот журнал plnkr вы можете видеть, что верхний уровень resolve
выполняется только после вложенный контроллер начал свой собственный процесс разрешения.