Я установил контроллер верхнего уровня, который создается только тогда, когда обещание (возвращаемое 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прекращается из-за ошибки (даже не выбрасываяErrors, но эта другая проблема), аConfigникогда не инициализируется контроллером верхнего уровня
Почему ui-router разрешает зависимости в обратном порядке? Как я могу легко разрешить мой TheResource объект после, верхний уровень MainCtrl разрешил Config (не полагаясь на $inject, конечно)?
UPDATE: от этот журнал plnkr вы можете видеть, что верхний уровень resolve выполняется только после вложенный контроллер начал свой собственный процесс разрешения.